Gsonを使用してJSON配列をjava.util.Listに解析する


119

私がしているJsonObjectという名前の"mapping"次の内容:

{
    "client": "127.0.0.1",
    "servers": [
        "8.8.8.8",
        "8.8.4.4",
        "156.154.70.1",
        "156.154.71.1"
    ]
}

私は配列"servers"を取得できることを知っています:

mapping.get("servers").getAsJsonArray()

そして今、それを解析JsonArrayしてjava.util.List...

これを行う最も簡単な方法は何ですか?



2
@ruakhその質問とこの質問の間には多くの違いがあります。これはを扱いGsonます。
アベルCallejo 2013

@AbelMelquiadesCallejoが回答を確認しています。問題が解決されることを願っています。
Prateek 2013

@ruakhはい、私はあなたに同意し、JsonArray実装を知っていますIterable。新しいライブラリを追加する以外の新しい方法も見つけているだけです。
アベルCallejo 2013

回答:


272

間違いなく最も簡単な方法は、Gsonのデフォルトの解析関数を使用することですfromJson()

任意のParameterizedType(たとえば、任意のList)に逆シリアル化する必要がある場合に適した、この関数の実装がありますfromJson(JsonElement json, Type typeOfT)

あなたのケースでは、次のようTypeにaのを取得しList<String>、JSON配列を解析してそのTypeに変換するだけです:

import java.lang.reflect.Type;
import com.google.gson.reflect.TypeToken;

JsonElement yourJson = mapping.get("servers");
Type listType = new TypeToken<List<String>>() {}.getType();

List<String> yourList = new Gson().fromJson(yourJson, listType);

あなたのケースではyourJsonあるJsonElementが、それはまた、可能性がありString、任意のReaderJsonReader

Gson APIのドキュメントご覧ください。


7
Typeどのパッケージにありますか?
アベルCallejo 2013

10
Typeパッケージに含まれているJava組み込みインターフェースですjava.lang.reflect
MikO 2013

getString()代わりに使うget()か、.fromJson()文句を言っていました。
lenooh

@MikO私はGsonと同様の質問をここに持っています。あなたが助けてくれるかどうか見たかった。私には解決策がありますが、問題はJSONをマップに解析するだけでは非常に面倒に見えることです。
john

18

以下のコードはを使用していcom.google.gson.JsonArrayます。リストの要素とリストの要素の数を印刷しました

import java.util.ArrayList;

import com.google.gson.Gson;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import com.google.gson.JsonParser;


public class Test {

    static String str = "{ "+ 
            "\"client\":\"127.0.0.1\"," + 
            "\"servers\":[" + 
            "    \"8.8.8.8\"," + 
            "    \"8.8.4.4\"," + 
            "    \"156.154.70.1\"," + 
            "    \"156.154.71.1\" " + 
            "    ]" + 
            "}";

    public static void main(String[] args) {
        // TODO Auto-generated method stub
        try {

            JsonParser jsonParser = new JsonParser();
            JsonObject jo = (JsonObject)jsonParser.parse(str);
            JsonArray jsonArr = jo.getAsJsonArray("servers");
            //jsonArr.
            Gson googleJson = new Gson();
            ArrayList jsonObjList = googleJson.fromJson(jsonArr, ArrayList.class);
            System.out.println("List size is : "+jsonObjList.size());
                    System.out.println("List Elements are  : "+jsonObjList.toString());


        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

}

出力

List size is : 4

List Elements are  : [8.8.8.8, 8.8.4.4, 156.154.70.1, 156.154.71.1]

8

ここでGsonの公式サイトから解決策を読みます

そしてあなたのためのこのコード:

    String json = "{"client":"127.0.0.1","servers":["8.8.8.8","8.8.4.4","156.154.70.1","156.154.71.1"]}";

    JsonObject jsonObject = new Gson().fromJson(json, JsonObject.class);
    JsonArray jsonArray = jsonObject.getAsJsonArray("servers");

    String[] arrName = new Gson().fromJson(jsonArray, String[].class);

    List<String> lstName = new ArrayList<>();
    lstName = Arrays.asList(arrName);

    for (String str : lstName) {
        System.out.println(str);
    }    

モニターに表示される結果:

8.8.8.8
8.8.4.4
156.154.70.1
156.154.71.1

上記と同じ答え-まだ静的メソッドを使用new Gson().fromJson()
Abel Callejo

よく私の問題は他のものでしたが、あなたのスニペットは私の問題を解決します。文字列のリストを保存しましたが、文字列を取得したいのですが。次に、スニペットでString []。classを配置してデータをフェッチできることを思い出してください。ありがとう
badarshahzad

2

@SerializedNameすべてのフィールドを使用するだけでリストマッピングを機能させることができましたType。周りのロジックは必要ありませんでした。

コードを実行する- 下記の手順4で、デバッガーを介して、List<ContentImage> mGalleryImagesオブジェクトにJSONデータが入力されていることが確認できます

次に例を示します。

1. JSON

   {
    "name": "Some House",
    "gallery": [
      {
        "description": "Nice 300sqft. den.jpg",
        "photo_url": "image/den.jpg"
      },
      {
        "description": "Floor Plan",
        "photo_url": "image/floor_plan.jpg"
      }
    ]
  }

2.リストを含むJavaクラス

public class FocusArea {

    @SerializedName("name")
    private String mName;

    @SerializedName("gallery")
    private List<ContentImage> mGalleryImages;
}

3.リスト項目のJavaクラス

public class ContentImage {

    @SerializedName("description")
    private String mDescription;

    @SerializedName("photo_url")
    private String mPhotoUrl;

    // getters/setters ..
}

4. JSONを処理するJavaコード

    for (String key : focusAreaKeys) {

        JsonElement sectionElement = sectionsJsonObject.get(key);
        FocusArea focusArea = gson.fromJson(sectionElement, FocusArea.class);
    }

0

で開始するとmapping.get("servers").getAsJsonArray()Guava Streamsにアクセスできる場合は、以下のワンライナーを実行できます。

List<String> servers = Streams.stream(jsonArray.iterator())
                              .map(je -> je.getAsString())
                              .collect(Collectors.toList());

StreamSupport上で動作することができなくなりJsonElement、それが不十分であるので、タイプ。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.