Verwenden von GSON zum Parsen eines JSON-Arrays


110

Ich habe eine JSON-Datei wie diese:

[
    {
        "number": "3",
        "title": "hello_world",
    }, {
        "number": "2",
        "title": "hello_world",
    }
]

Früher, wenn Dateien ein Root-Element hatten, würde ich verwenden:

Wrapper w = gson.fromJson(JSONSTRING, Wrapper.class);

Code, aber ich kann mir nicht vorstellen, wie man die WrapperKlasse codiert, da das Stammelement ein Array ist.

Ich habe versucht:

Wrapper[] wrapper = gson.fromJson(jsonLine, Wrapper[].class);

mit:

public class Wrapper{

    String number;
    String title;

}

Aber ich hatte kein Glück. Wie kann ich das sonst mit dieser Methode lesen?

PS Ich habe dies zum Arbeiten mit:

JsonArray entries = (JsonArray) new JsonParser().parse(jsonLine);
String title = ((JsonObject)entries.get(0)).get("title");

Aber ich würde es vorziehen zu wissen, wie man es (wenn möglich) mit beiden Methoden macht.


4
Sind Sie sicher, dass nach den Titelelementen ein Komma steht? Wenn Sie sie entfernen, Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);funktioniert es gut für mich.
Pshemo

1
Das ist das Problem ... so ein einfacher Fehler!
Eduardo

Antworten:


112

Das Problem wird durch ein Komma am Ende (in Ihrem Fall jeweils ) des im Array platzierten JSON-Objekts verursacht:

{
    "number": "...",
    "title": ".." ,  //<- see that comma?
}

Wenn Sie sie entfernen, werden Ihre Daten

[
    {
        "number": "3",
        "title": "hello_world"
    }, {
        "number": "2",
        "title": "hello_world"
    }
]

und

Wrapper[] data = gson.fromJson(jElement, Wrapper[].class);

sollte gut funktionieren.



1
@Snake BTW, im Falle einer jacksonBibliothek und dieses Kommentars ist das Erstellen und Arrays.asList(..)Umschließen eines Arrays schneller als das Erstellen einer Liste mit TypeRefence. Ich habe es nicht mit der gsonBibliothek getestet, aber es kann sich lohnen, es zu vergleichen.
Pshemo

39
Gson gson = new Gson();
Wrapper[] arr = gson.fromJson(str, Wrapper[].class);

class Wrapper{
    int number;
    String title;       
}

Scheint gut zu funktionieren. ,In Ihrer Zeichenfolge befindet sich jedoch ein zusätzliches Komma.

[
    { 
        "number" : "3",
        "title" : "hello_world"
    },
    { 
        "number" : "2",
        "title" : "hello_world"
    }
]

16
public static <T> List<T> toList(String json, Class<T> clazz) {
    if (null == json) {
        return null;
    }
    Gson gson = new Gson();
    return gson.fromJson(json, new TypeToken<T>(){}.getType());
}

Beispielaufruf:

List<Specifications> objects = GsonUtils.toList(products, Specifications.class);

4
Für mich bedeutet dies, dass meine Objekte in eine Liste von LinkedTreeMap anstatt in eine Liste von Spezifikationsobjekten (zum Beispiel) umgewandelt werden.
Ryan Newsom

Woher hast du die GsonUtils-Klasse?
Rosu Alin

GsonUtilsist die Klasse, in der er seine eigene toList()Methode einsetzt.
user1438038

Dies kann nicht funktionieren: Das TypeToken muss einen falschen Wert erstellen, da T beim Kompilieren nicht bekannt ist. Dadurch wird wahrscheinlich das Typ-Token für List <Object> erstellt. Sie müssten die tatsächliche Klasse verwenden, wenn Sie den Typ erstellen.
Hans-Peter Störr

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.