Android で GSON を使用して JSON データを解析すると、「java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 columns 73」エラーが発生するのはなぜですか?

Barbara Streisand
リリース: 2024-11-01 14:07:29
オリジナル
976 人が閲覧しました

Why am I getting the

Android で GSON を使用して JSON データを解析する方法: エラー解決

Android で GSON を使用して JSON データを解析すると、エラーが発生する場合があります: "java.lang.IllegalStateException: BEGIN_OBJECT が予期されましたが、行 1 列 73 に NAME がありました。"このエラーは、JSON データの構文の問題、具体的には左中括弧の欠落を示します。

考えられる解決策

この問題を解決するには、JSON データが正しく設定されていることを確認してください。フォーマットされており、左中括弧と右中括弧の両方が含まれています。例:

<code class="json">{
    "count": "12",
    "colbreak": 1,
    ...
    "seek": 0
}</code>
ログイン後にコピー

一般的な原因

このエラーの一般的な原因の 1 つは、ファイルに保存されている、またはサーバーから文字列としてダウンロードされた JSON データを受信して​​いることです。 。このような場合、文字列が適切にエンコードまたはプレフィックスされていない可能性があり、解析エラーが発生する可能性があります。

カスタム クラスの変更

コードでは Java を使用しています。リフレクションを使用して、JSON データ構造を表すカスタム クラス GsonParse を作成します。このアプローチは一般的に推奨されません。代わりに、GsonParse のフィールドごとに明示的なゲッター メソッドとセッター メソッドを作成します。さらに、JSON プロパティ名と一致するように、クラス名とフィールド名に @SerializedName の注釈を付けます。

次に例を示します:

<code class="java">public class GsonParse {

    @SerializedName("count")
    private String count;

    @SerializedName("colbreak")
    private String colbreak;

    @SerializedName("name")
    private String name;

    @SerializedName("score")
    private String score;

    @SerializedName("Words")
    private List<Words> mWords = new ArrayList<>();

    @SerializedName("seek")
    private String seek;

    // Add getters and setters here...
}</code>
ログイン後にコピー

UTF-8 エンコーディング

JSON データが UTF-8 形式で適切にエンコードされていることを確認してください。 HTTP 経由で JSON データを受信する場合、サーバーは適切な Content-Type ヘッダー (例: 'application/json; charset=utf-8') で応答する必要があります。

改善された解析方法

Reader を使用する解析メソッドの改良版を次に示します。

<code class="java">public static <T> ArrayList<T> JsonParse(T t, Reader reader) {
    ArrayList<T> lcs = new ArrayList<>();
    try {
        Gson gson = new Gson();
        JsonReader jsonReader = new JsonReader(reader);

        jsonReader.beginObject();
        while (jsonReader.hasNext()) {
            T cse = (T) gson.fromJson(jsonReader, t.getClass());
            lcs.add(cse);
        }
        jsonReader.endObject();
        jsonReader.close();
    } catch (UnsupportedEncodingException | IOException e) {
        e.printStackTrace();
    }
    return (ArrayList<T>) lcs;
}</code>
ログイン後にコピー

使用法

このメソッドを使用するには、ソース (ファイルや HTTP 応答など) を取得し、それを JsonParse メソッドに渡します:

<code class="java">InputStream ims = assetManager.open("file.txt");
Reader reader = new InputStreamReader(ims, "UTF-8");

ArrayList<GsonParse> gsonObjects = JsonParse(new GsonParse(), reader);</code>
ログイン後にコピー

以上がAndroid で GSON を使用して JSON データを解析すると、「java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 columns 73」エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!