GSONを使用してJSON配列を解析する


110

次のようなJSONファイルがあります。

[
    {
        "number": "3",
        "title": "hello_world",
    }, {
        "number": "2",
        "title": "hello_world",
    }
]

以前、ファイルにルート要素があったとき、私は次のように使用しました

Wrapper w = gson.fromJson(JSONSTRING, Wrapper.class);

コードですがWrapper、ルート要素が配列であるため、クラスのコーディング方法を考えることができません。

私は使ってみました:

Wrapper[] wrapper = gson.fromJson(jsonLine, Wrapper[].class);

と:

public class Wrapper{

    String number;
    String title;

}

しかし、運はありませんでした。この方法を使用して他にどのようにこれを読むことができますか?

PS私はこれを使って動作するようにしています:

JsonArray entries = (JsonArray) new JsonParser().parse(jsonLine);
String title = ((JsonObject)entries.get(0)).get("title");

ただし、両方の方法で(可能な場合)方法を知りたいと思います。


4
タイトル要素の後にカンマがあることを確認しますか?あなたがそれらを削除した場合Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);、私にとってはうまくいきます。
Pshemo 2013

1
それが問題だ……そんな単純な間違い!
エドゥアルド

回答:


112

問題は、配列に配置されたJSONオブジェクト(それぞれの場合)の最後のコンマによって引き起こされます。

{
    "number": "...",
    "title": ".." ,  //<- see that comma?
}

それらを削除すると、データは

[
    {
        "number": "3",
        "title": "hello_world"
    }, {
        "number": "2",
        "title": "hello_world"
    }
]

そして

Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);

正常に動作するはずです。


1
@SnakeはGoogle Gsonを
Pshemo

1
@Snake BTW、jacksonライブラリとこのコメントの場合、Arrays.asList(..)TypeRefenceを使用してリストを作成するよりも、配列を作成してそれをラップする方が高速です。gsonライブラリではテストしていませんが、ベンチマークする価値があるかもしれません。
Pshemo

39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

正常に動作するようです。しかし,、文字列に余分なコンマがあります。

[
    { 
        "number" : "3",
        "title" : "hello_world"
    },
    { 
        "number" : "2",
        "title" : "hello_world"
    }
]

16
public static <T> List<T> toList(String json, Class<T> clazz) {
    if (null == json) {
        return null;
    }
    Gson gson = new Gson();
    return gson.fromJson(json, new TypeToken<T>(){}.getType());
}

サンプル呼び出し:

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);

4
私にとって、これは私のオブジェクトを(たとえば)仕様オブジェクトのリストではなく、LinkedTreeMapのリストに変えることです。
Ryan Newsom

GsonUtilsクラスはどこで入手しましたか?
rosu alin 2017

GsonUtils彼は自分のtoList()メソッドを置いたクラスです。
user1438038

これは機能しません。Tはこれがコンパイルされたときに不明であるため、TypeTokenは誤った値を作成する必要があります。これにより、おそらくList <Object>のタイプトークンが作成されます。タイプを作成するときは、実際のクラスを使用する必要があります。
Hans-PeterStörr

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