Heim  >  Artikel  >  Java  >  Wie behebe ich den Fehler „Erwartetes BEGIN_OBJECT, war aber NAME“ beim Parsen von verschachteltem JSON mit GSON in Android?

Wie behebe ich den Fehler „Erwartetes BEGIN_OBJECT, war aber NAME“ beim Parsen von verschachteltem JSON mit GSON in Android?

DDD
DDDOriginal
2024-10-28 10:18:02902Durchsuche

How to Fix the

JSON-Parsing mit GSON in Android

Wie können Sie das JSON-Parsing mit GSON in Android vereinfachen? Lassen Sie uns ein häufiges Problem bei der Verwendung von GSON untersuchen und uns Schritt für Schritt mit der Lösung befassen.

Problemstellung:

Wenn Sie GSON zum Parsen einer JSON-Zeichenfolge verwenden, müssen Sie Möglicherweise tritt der Fehler „Erwartetes BEGIN_OBJECT, war aber NAME“ auf. Dies tritt normalerweise auf, wenn Sie versuchen, ein JSON-Objekt zu analysieren, das in einem Array verschachtelt ist.

JSON-Beispiel:

Berücksichtigen Sie die folgenden JSON-Daten:

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

Code:

Ihr Code, der GSON zum Parsen verwendet:

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

Fehler:

Dies wird ausgeführt Code kann zu einem Fehler wie dem folgenden führen:

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

Lösung:

Um diesen Fehler zu beheben, müssen Sie die Art und Weise ändern, wie Sie den JSON-Wert lesen. Anstatt die gesamte JSON-Zeichenfolge zu durchlaufen, sollten Sie zu dem spezifischen Objekt springen, das Sie analysieren möchten, und es dann dekodieren.

Überarbeitete Methode:

Hier ist eine korrigierte Version der JsonParse-Methode:

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

Erklärung:

In dieser überarbeiteten Methode prüft der Code, ob der aktuelle JSON-Name „Words“ ist und wenn ja, beginnt er Lesen des Arrays. Anschließend durchläuft es jedes Objekt im Array, analysiert es mithilfe von GSON und fügt es der Liste hinzu. Bei allen anderen JSON-Namen wie „count“ oder „score“ überspringt die Methode diese einfach.

Zusätzliche Überlegungen:

  • Stellen Sie sicher, dass Ihre Modellklassen (GsonParse und Words) haben Getter und Setter für alle JSON-Felder.
  • Wenn Sie JSON aus einer Datei im Assets-Ordner lesen, stellen Sie sicher, dass Sie InputStreamReader anstelle von JsonReader verwenden.
  • Um UTF-8-Zeichen zu unterstützen, konvertieren Sie die JSON-Zeichenfolge vor dem Parsen in UTF-8.

Das obige ist der detaillierte Inhalt vonWie behebe ich den Fehler „Erwartetes BEGIN_OBJECT, war aber NAME“ beim Parsen von verschachteltem JSON mit GSON in Android?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn