Rumah  >  Artikel  >  Java  >  Bagaimana untuk Membetulkan Ralat \"Dijangkakan BEGIN_OBJECT tetapi NAME\" Semasa Menghuraikan JSON Bersarang dengan GSON dalam Android?

Bagaimana untuk Membetulkan Ralat \"Dijangkakan BEGIN_OBJECT tetapi NAME\" Semasa Menghuraikan JSON Bersarang dengan GSON dalam Android?

DDD
DDDasal
2024-10-28 10:18:02902semak imbas

How to Fix the

JSON Parsing dengan GSON dalam Android

Bagaimanakah anda boleh memudahkan JSON parsing dengan GSON dalam Android? Mari kita terokai isu biasa apabila menggunakan GSON dan mendalami penyelesaian langkah demi langkah.

Pernyataan Masalah:

Apabila menggunakan GSON untuk menghuraikan rentetan JSON, anda mungkin menghadapi ralat "Dijangka BEGIN_OBJECT tetapi ialah NAME". Ini biasanya berlaku apabila anda cuba menghuraikan objek JSON yang bersarang dalam tatasusunan.

Contoh JSON:

Pertimbangkan data JSON berikut:

<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>

Kod:

Kod anda menggunakan GSON untuk menghurai:

<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>

Ralat:

Menjalankan ini kod boleh mengakibatkan ralat seperti:

com.google.gson.JsonSyntaxException: java.lang.IllegalStateException: Expected BEGIN_OBJECT but was NAME at line 1 column 73

Penyelesaian:

Untuk menyelesaikan ralat ini, anda perlu mengubah suai cara anda membaca nilai JSON. Daripada menggelung seluruh rentetan JSON, anda harus melangkau ke objek tertentu yang anda mahu hurai dan kemudian menyahkodnya.

Kaedah Disemak:

Ini adalah versi yang diperbetulkan daripada kaedah 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>

Penjelasan:

Dalam kaedah yang disemak ini, kod menyemak sama ada nama JSON semasa ialah "Words" dan jika ya, bermula membaca tatasusunan. Ia kemudian menggelung melalui setiap objek dalam tatasusunan, menghuraikannya menggunakan GSON dan menambahkannya ke senarai. Untuk mana-mana nama JSON yang lain, seperti "kiraan" atau "skor," kaedah tersebut hanya melangkaui nama tersebut.

Pertimbangan Tambahan:

  • Pastikan anda kelas model (GsonParse dan Words) mempunyai getter dan setter untuk semua medan JSON.
  • Jika anda membaca JSON daripada fail dalam folder aset, pastikan anda menggunakan InputStreamReader dan bukannya JsonReader.
  • Untuk menyokong aksara UTF-8, tukar rentetan JSON kepada UTF-8 sebelum menghuraikannya.

Atas ialah kandungan terperinci Bagaimana untuk Membetulkan Ralat \"Dijangkakan BEGIN_OBJECT tetapi NAME\" Semasa Menghuraikan JSON Bersarang dengan GSON dalam Android?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn