Android での GSON を使用した JSON 解析
Android で GSON を使用した JSON 解析を簡素化するにはどうすればよいですか? GSON を使用する際の一般的な問題を調べ、段階的な解決策を詳しく見てみましょう。
問題ステートメント:
GSON を使用して JSON 文字列を解析する場合、 「BEGIN_OBJECT が予期されましたが、NAME でした」エラーが発生する可能性があります。これは通常、配列内でネストされている JSON オブジェクトを解析しようとしたときに発生します。
JSON の例:
次の JSON データを考えてみましょう:
<code class="json">{ "count": "12", "colbreak": 1, "name": "unary rels", "score": "9090", "Words": [ { "count": 6, "word": "prp_għaċ-", "name": "prp_għaċ-", "score": 9.1, "Words": "kol", "seek": 2231297 } ], "seek": 0 }</code>
コード:
解析に GSON を使用するコード:
<code class="java">public static <T> ArrayList<T> JsonParse(T t, String response) { // ... while (reader.hasNext()) { T cse = (T) gson.fromJson(reader, t.getClass()); lcs.add(cse); } // ... }</code>
エラー:
これを実行していますコードでは次のようなエラーが発生する可能性があります:
com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 column 73
解決策:
このエラーを解決するには、JSON 値の読み取り方法を変更する必要があります。 JSON 文字列全体をループするのではなく、解析したい特定のオブジェクトまでスキップして、それをデコードする必要があります。
改訂されたメソッド:
修正されたバージョンは次のとおりです。 JsonParse メソッドの:
<code class="java">public static <T> ArrayList<T> JsonParse(T t, String response) { // ... while (reader.hasNext()) { String name = reader.nextName(); if (name.equals("Words")) { reader.beginArray(); while (reader.hasNext()) { T cse = (T) gson.fromJson(reader, t.getClass()); lcs.add(cse); } reader.endArray(); } else { reader.skipValue(); } } // ... }</code>
説明:
この改訂されたメソッドでは、コードは現在の JSON 名が "Words" かどうかを確認し、そうである場合はコードを開始します。配列を読み取っています。次に、配列内の各オブジェクトをループし、GSON を使用してオブジェクトを解析し、リストに追加します。 「count」や「score」などの他の JSON 名については、メソッドはそれらをスキップします。
追加の考慮事項:
以上がAndroid で GSON を使用してネストされた JSON を解析するときに発生する「BEGIN_OBJECT が予期されましたが、NAME でした」エラーを修正する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。