Lesen mehrere Elemente, die aus json-Datei
habe ich eine json-Datei mit vielen Elementen wie diese:
{
"code" : "hfuiew89",
"type" : "location",
"coordinates" : [ { "lat" : 40.9861, "lon" : 29.1046, "index" : 1 },
{ "lat" : 40.9976, "lon" : 29.1153, "index" : 2 },
{ "lat" : 40.9809, "lon" : 29.2194, "index" : 3 }]
}
{
"code" : "klsdsjh",
"type" : "location",
"relatedTags" : [ "kolmha" ],
"coordinates" : [ { "lat" : 40.9808, "lon" : 29.1605, "index" : 1 },
{ "lat" : 40.9965, "lon" : 29.1672, "index" : 2 }]
}
möchte ich zu Lesen, dass die Datei mit gson aber alle Beispiele, die ich fand, sind nur für ein element. daher nach dem Lesen der ersten ein, wirft 'Erwartet EOF' Ausnahme. wie kann ich das umgehen?
- JSON ist dazu gedacht, eine einzelne Entität (ein Objekt, oder ein array) - und was du hast ist mehrere Objekte. Was Sie wirklich wollen, in dieser situation ist ein array auf der obersten Ebene, die mit jedem Objekt als ein element in Ihr. Können Sie Einfluss auf die Generierung dieser JSON, oder sind Sie stecken mit diesem format?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Greg ist richtig, dies ist falsch, JSON, und Sie sollten versuchen, generieren Valide JSON, ist prepend "[" am Anfang, " append "]" am Ende, und trennen Sie jedes element mit einem Komma (","), so dass es ein JSON-array mit JSON-Objekt.
Aber, wenn Sie nicht das format ändern, das Sie haben, halten es für "eine Zeichenfolge, die die Verkettung wohlgeformte JSON-Fragmente". Nähert sich auf diese Weise, brechen die großen string in kleinere, gültige json-strings, und analysieren Sie eins nach dem anderen.
Brechen die großen string in einzelne Fragmente können Sie einfach die Anzahl der Klammern. Mit einem "pre-parser" kopiert, die Sachen in einen Puffer (einen StringBuilder?), erhöht einen Zähler jedesmal, wenn es auf ein "{", verringert Sie sich jedes mal, wenn es enouters eine "}", und wenn der Zähler bei null übergeben Sie die Puffer-string der gson für das Parsen, deaktivieren Sie den Puffer, und gehen Sie zum Ende der Datei.
Können Sie auch verwenden, die pre-parser für die Konvertierung in einen gültigen json, einfach Anhängen "," wenn der Zähler null erreicht, und das vergehen alles zu gson für einen einzelnen analysieren, aber das könnte bedeuten, laden alles in den ram, und ich weiß nicht, wie groß deine Datei ist.
Für was es Wert ist...
Die folgende Anweisung ist falsch. Gson nicht über eine eingebaute Funktion, um einfach handhaben Deserialisierung von solchen JSON-Sequenz. (Siehe Kommentare.)
Wenn das Umschalten JSON-to/from-Java-APIs ist eine option, Jackson hat solch eine Funktion, wie unten gezeigt.
Eingang.json
JacksonFoo.java
Ausgabe:
Update: Eine ähnliche Lösung mittels Gson.
GsonFoo.java