Gson for Javaを使用したJSON解析


154

タイプのJSONからのデータを解析したいと思いますStringGoogle Gsonを使用しています

私が持っています:

jsonLine = "
{
 "data": {
  "translations": [
   {
    "translatedText": "Hello world"
   }
  ]
 }
}
";

そして私のクラスは:

public class JsonParsing{

   public void parse(String jsonLine) {

      // there I would like to get String "Hello world"

   }

}

回答:


241

これはそれを行うための単純なコードであり、私はすべてのチェックを避けましたが、これが主なアイデアです。

 public String parse(String jsonLine) {
    JsonElement jelement = new JsonParser().parse(jsonLine);
    JsonObject  jobject = jelement.getAsJsonObject();
    jobject = jobject.getAsJsonObject("data");
    JsonArray jarray = jobject.getAsJsonArray("translations");
    jobject = jarray.get(0).getAsJsonObject();
    String result = jobject.get("translatedText").getAsString();
    return result;
}

使用をより一般的にするために、Gsonのjavadocsは非常に明確で役立つことがわかります。


1
JsonObjectはJsonElementを拡張するので、両方です。
MByD 2011年

最初の行のスローでは、バージョンgson-2.2.4.jarでタイプJsonParserをインスタンス化できません
不正な引数

3
文字列の結果= jobject.get( "translatedText")。toString(); この結果には二重引用符が含まれます。文字列の結果= jobject.get( "translatedText")。getAsString(); 引用符は含まれません。
user1165560 2015年

Gsonが事情を98%以上複雑化していると考えるのは私だけですか?単純なJSONObjectで十分ですが、私たちは皆、そんなに多くのtry / catchを嫌いますか?
トリックノロジー

パーサークラスを使用する必要がありますが、MalformedJsonExceptionが発生するため、JsonParserでSetLeinientを実行できるようにする必要があります。どうやって?
Mason Wang

111

最初のgsonアプリケーションでは、主に構成の問題にjsonを使用するため、追加のクラスを使用して値をキャッチすることを避けました

情報が不足しているにもかかわらず(gsonページでさえ)、それが私が見つけて使用したものです。

から始まる

Map jsonJavaRootObject = new Gson().fromJson("{/*whatever your mega complex object*/}", Map.class)

gsonは{}を見つけるたびに、マップ(実際にはgson StringMap)を作成します

gsonは ''を見つけるたびに、文字列を作成します

gsonは数値を見るたびに、Doubleを作成します

gsonは[]を見つけるたびにArrayListを作成します

この事実を(組み合わせて)利用することができます

最後にこれは物事を作るコードです

        Map<String, Object> javaRootMapObject = new Gson().fromJson(jsonLine, Map.class);

    System.out.println(
        (
            (Map)
            (
                (List)
                (
                    (Map)
                    (
                        javaRootMapObject.get("data")
                    )
                 ).get("translations")
            ).get(0)
        ).get("translatedText")
    );

20

最も単純なことは、通常、次のように一致するオブジェクト階層を作成することです。

public class Wrapper {
   public Data data;
}
static class Data {
   public Translation[] translations;
}
static class Translation {
   public String translatedText;
}

次に、GSONを使用してバインドし、フィールドを介してオブジェクト階層をトラバースします。ゲッターとセッターを追加しても、基本的なデータコンテナーには意味がありません。

だから次のようなもの:

Wrapper value = GSON.fromJSON(jsonString, Wrapper.class);
String text = value.data.translations[0].translatedText;

2
次に、オブジェクト構造がJSONと一致しません。
StaxMan 2015年


8

別のクラスを使用してJSONオブジェクトを表し、@SerializedNameアノテーションを使用して、各データメンバーに取得するフィールド名を指定できます。

public class Response {

   @SerializedName("data")
   private Data data;

   private static class Data {
      @SerializedName("translations")
      public Translation[] translations;
   }

   private static class Translation {
      @SerializedName("translatedText")
      public String translatedText;
   }

   public String getTranslatedText() {
      return data.translations[0].translatedText;
   }
}

次に、Gsonオブジェクトを使用してparse()メソッドで解析を実行できます。

Gson gson = new Gson();
Response response = gson.fromJson(jsonLine, Response.class);

System.out.println("Translated text: " + response.getTranslatedText());

このアプローチでは、Responseクラスを再利用して他のフィールドを追加し、JSONから抽出する可能性のある他のデータメンバーを取得できます。たとえば、1回の呼び出しで複数の翻訳の結果を取得するために変更を加える場合は、または、検出されたソース言語の追加の文字列を取得します。


7

1つの方法は、JsonObjectを作成し、パラメーターを反復処理することです。例えば

JsonObject jobj = new Gson().fromJson(jsonString, JsonObject.class);

次に、次のようなBean値を抽出できます。

String fieldValue = jobj.get(fieldName).getAsString();
boolean fieldValue = jobj.get(fieldName).getAsBoolean();
int fieldValue = jobj.get(fieldName).getAsInt();

お役に立てれば。


5

Gsonを使用して解決
するjson文字列に個々のパラメーターのクラスを作成します。または、「Data」というメインクラスを1つ作成してから、同様に内部クラスを作成することもできます。明確にするために、個別のクラスを作成しました。

クラスは以下の通りです。

  • データ
  • 翻訳
  • TranslatedText

クラスJsonParsingでは、メソッド「parse」を呼び出します。gson.fromJson(jsonLine, Data.class)これは、Reflectionを使用してJavaオブジェクトの文字列を変換します。

「Data」オブジェクトにアクセスすると、各パラメーターに個別にアクセスできます。

開発マシンから離れているため、このコードをテストする機会がありませんでした。しかし、これは役立つはずです。

いくつかの良い例と記事。
http://albertattard.blogspot.com/2009/06/practical-example-of-gson.html
http://sites.google.com/site/gson/gson-user-guide

コード

public class JsonParsing{

       public void parse(String jsonLine) {

           Gson gson = new GsonBuilder().create();
           Data data = gson.fromJson(jsonLine, Data.class);

           Translations translations = data.getTranslation();
           TranslatedText[] arrayTranslatedText = translations.getArrayTranslatedText(); //this returns an array, based on json string

           for(TranslatedText translatedText:arrayTranslatedText )
           {
                  System.out.println(translatedText.getArrayTranslatedText());
           }
       }

    }


    public class Data{
           private  Translations translations;
          public Translations getTranslation()
          {
             return translations;
          }

          public void setTranslation(Translations translations)
           {
                  this.translations = translations;
           }
    }

    public class Translations
    {
        private  TranslatedText[] translatedText;
         public TranslatedText[] getArrayTranslatedText()
         {
             return translatedText;
         }

           public void setTranslatedText(TranslatedText[] translatedText)
           {
                  this.translatedText= translatedText;
           }
    }

    public class TranslatedText
    {
        private String translatedText;
        public String getTranslatedText()
        {
           return translatedText;
        }

        public void setTranslatedText(String translatedText)
        {
           this.translatedText = translatedText;
        }
    }

これらのヘルパークラスのセッターは必要ありませんか?private String translatedTextアクセス制御に違反しないと何も設定fromJSONできないため、アクセス制御全体でリフレクショントランプルをオプトインしていないJVMで設定することはできません。
マイクサミュエル

@Mike Samuelのシュートはセッターを完全に忘れていました
ジョン

3
    JsonParser parser = new JsonParser();
    JsonObject jo = (JsonObject) parser.parse(data);
    JsonElement je = jo.get("some_array");

    //Parsing back the string as Array
    JsonArray ja = (JsonArray) parser.parse(o.get("some_array").getAsString());
    for (JsonElement jo : ja) {
    JsonObject j = (JsonObject) jo;
        // Your Code, Access json elements as j.get("some_element")
    }

このようなJSONを解析する簡単な例

{"some_array": "[\" some_element \ ":1、\" some_more_element \ ":2]"、 "some_other_element":3}


2

まず、以下の解析サイトを使用してゲッターとセッターを生成します

http://www.jsonschema2pojo.org/

Gsonを使用する

GettetSetterClass object=new Gson().fromjson(jsonLine,GettetSetterClass.class);

オブジェクトを使用して、data、translationTextなどの値を取得します


2

JsonPathクエリを使用して値を抽出できます。そして、GsonがサポートするJsonSurferを使用すると、2行のコードで問題を解決できます。

    JsonSurfer jsonSurfer = JsonSurfer.gson();
    String result = jsonSurfer.collectOne(jsonLine, String.class, "$.data.translations[0].translatedText");

1

1行のコード:

System.out.println(new Gson().fromJson(jsonLine,JsonObject.class).getAsJsonObject().get("data").getAsJsonObject().get("translations").getAsJsonArray().get(0).getAsJsonObject().get("translatedText").getAsString());
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.