Frage

Kurz gesagt, ist dies eine Skizze des JSON-Objekts ich in JAVA analysieren will:

{
    object1: {
            item1: //[String | Array | Object] ,
            item2: // ...
            //<> more items
    object2: { /* .. */ }
    //<> more objects
}

Dies sind die POJO s ich für die Analyse erstellt (Ich werde die import Aussagen der Kürze halber auslassen):

(1) Die Darstellung des kompletten JSON Objekt

public class JObjectContainer {

    private List<JObject> jObjects ;

    public JObjectContainer() { }

    //get & set methods

}

(2) Die Darstellung der verschachtelten Objekte:

 public class JObject {

    private String id ;
    private List<JNode> jObjects ;

    public JObject() { } 

    //get & set methods

}

(3) Die Darstellung der Einzelteile:

 public class JNode {

    private JsonElement item1 ;
    private JsonElement item2 ;
    //<> more item fields

    public JNode() { }

    //get & set methods

}

Nun, eine Gson Instanz (FileReader die jsonFile für den Import),

 Gson gson = new Gson() ;
 JObjectContainer joc = gson.fromJson(jsonFile,JObjectContainer.class) ;

ich eine NullPointerException bekommen, wenn ich versuche, das parseable Objekt zuzugreifen (beispielsweise durch einen ListIterator). Gson hat jedoch ein Objekt der Klasse erstellen I angegeben und nicht keine Folgefehler werfen.

Ich weiß, dass dies zuvor getan wurde. Also, was bin ich dabei?

TIA

War es hilfreich?

Lösung

Das ist nicht möglich. Sie benötigen eine JSON-Struktur ändern object1, object2, usw. als Elemente eines Array darstellen . Gerade jetzt sind sie Eigenschaften eines Objekts, von denen es anscheinend nicht bekannt, wie viele von ihnen werden (sonst haben Sie es nicht als List abzubilden versuchen). Gson ist klug, aber nicht , die smart:)

So, wie ein einfaches Beispiel, die JSON-Struktur mit einem Array:

{ nodes:
  [
    { item1: 'value1a', item2: 'value2a' },
    { item1: 'value1b', item2: 'value2b' },
    { item1: 'value1c', item2: 'value2c' }
  ]
}

in Kombination mit der Java-Darstellung (die nicht notwendigerweise POJO genannt werden, aber nur javabean oder Modellobjekt oder Wertobjekt).

public class Container {
    private List<Node> nodes;
    // +getter.
}

public class Node {
    private String item1;
    private String item2;
    // +getters.
}

und dieser Gson Aufruf

Container container = new Gson().fromJson(json, Container.class);

sollte funktionieren.

Aktualisieren : klar zu sein, Ihre JSON-Struktur ist das Problem, nicht die Java-Objekt-Struktur. Unter der Annahme, dass Ihre Java-Objekt-Struktur ist genau das, was Sie möchten, um am Ende mit, dann JSON Struktur aussehen sollte wie folgt Gson zu bekommen, seine Arbeit zu tun:

{ jObjects:
  [
    { id: 123, jObjects: 
      [
        { item1: 'value1a', item2: 'value2a' },
        { item1: 'value1b', item2: 'value2b' },
        { item1: 'value1c', item2: 'value2c' }
        /* etc... commaseparated */
      ]
    },
    { id: 456, jObjects: 
      [
        { item1: 'value1d', item2: 'value2d' },
        { item1: 'value1e', item2: 'value2e' },
        { item1: 'value1f', item2: 'value2f' }
        /* etc... commaseparated */
      ]
    }
    /* etc... commaseparated */
  ]
}

Nur die JsonElement Eigenschaft sollte durch String ersetzt werden, da es ungültig ist.

Andere Tipps

Ich denke, BalusC gab gute Hinweise für die spezifische Frage WRT Gson (und in der Regel eine Eins-zu-Eins-Datenbindung); aber nur für den Fall denken Sie sollten dynamischere Handhabung sein, können Sie auch andere JSON Verarbeitung von Paketen in Erwägung ziehen könnten. Viele Pakete haben zusätzliche oder alternative Möglichkeiten, Dinge zu kartieren: Json-lib, flexjson und Jackson zumindest haben Ergänzungen im Vergleich zu Gson. Einige bieten lockeren Mapping (Sie Namen der Dinge zu Typen definieren), andere tatsächliche Unterstützung für polymporphic Typen (ein Objekt deklariert, sondern kann Karte tatsächlich zu Subtyp, den serialisiert wurde).

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top