6

Web サービスから JSON データを取得しています。サンプル データを以下に示します。

[
  {
    "SectionId": 1,
    "SectionName": "Android"
  }
]

変換しようとすると、エラーがスローされます。次のようにしています。

Data data = new Gson().fromJson(jsonDataFromWebService, Data.class);

私のセクションクラスは次のとおりです。

class Section
{
    public int SectionId;
    public String SectionName;
}

class Data {
    public List<Section> sections;
}

LogCat は次のように述べています。

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: BEGIN_OBJECT が必要でしたが、1 行目の列 2 で BEGIN_ARRAY でした

4

3 に答える 3

8

JSONArray から非配列 (コレクション) オブジェクトを作成しようとしています。エラーは明らかです。GSON はオブジェクトの先頭を予期していましたが、代わりに配列の先頭を検出しました。

以下のドキュメント ページを参照して、GSON で配列型とコレクション型を操作する方法を確認してください。

https://sites.google.com/site/gson/gson-user-guide#TOC-Collections-Examples

ドキュメントから:

配列の例

Gson gson = 新しい Gson(); int[] ints = {1, 2, 3, 4, 5}; String[] 文字列 = {"abc", "def", "ghi"};

(シリアライズ) gson.toJson(ints); ==> 出力 [1,2,3,4,5] gson.toJson(strings); ==> 出力 ["abc", "def", "ghi"]

(逆シリアル化) int[] ints2 = gson.fromJson("[1,2,3,4,5]", int[].class); ==> ints2 は ints と同じになります

また、任意の複雑な要素タイプを持つ多次元配列もサポートしています コレクション 例

Gson gson = 新しい Gson(); コレクション ints = Lists.immutableList(1,2,3,4,5);

(シリアライズ) 文字列 json = gson.toJson(ints); ==> json は [1,2,3,4,5] です

(デシリアライゼーション) Type collectionType = new TypeToken>(){}.getType(); コレクション ints2 = gson.fromJson(json, collectionType); ints2 は ints と同じです

かなり恐ろしい: コレクションの型を定義する方法に注意してください 残念ながら、Java でこれを回避する方法はありません

コレクションの制限

任意のオブジェクトのコレクションをシリアル化できますが、そこから逆シリアル化することはできません ユーザーが結果のオブジェクトの型を示す方法がないため 逆シリアル化している間、コレクションは特定のジェネリック型でなければなりません これはすべて意味があり、ほとんど問題になりませんw> 優れた Java コーディング プラクティスに従う場合

于 2012-02-25T07:33:54.780 に答える
6

エラーは何が悪いのかを説明しています... ur は JSON オブジェクトではなく配列を返します

次のようにしてみてください:

JSONArray ja = new JSONArray(jsonStringReturnedByService);

Data sections = new Data();

for (int i = 0; i < ja.length(); i++) {
    Section s = new Section();
    JSONObject jsonSection = ja.getJSONObject(i);

    s.SectionId = Integer.ValueOf(jsonSection.getString("SectionId"));
    s.SectionName = jsonSection.getString("SectionName");

   //add it to sections list
   sections.add(s);
}

return sections;
于 2012-02-25T07:24:59.130 に答える