Frage

Ich versuche, eine JSON-Struktur ähnlich wie diese zu analysieren:

    {
 "cars": {
  "112": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1998"
  },
  "642": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "1990"
  },
  "9242": {
   "make": "Cadillac",
   "model": "Eldorado",
   "year": "2001"
  }
 }}

Ich habe eine CarEntity Klasse definiert mit makeName, Modell, Baujahr Attribute definiert und zugänglich über Setter / Getter.

Ich versuche, diese JSON wie diese deserialisiert:

    Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json);

und es funktioniert nicht :( Es es nicht deserialisieren, aber nicht in Map<String, CarEntity> sondern in tiefe Karte (so etwas wie Map<String, Map<String, Map<String, String>>>)

Was mache ich falsch?

War es hilfreich?

Lösung

Sie sind Problem ist Ihr json hat zwei Karten. Einer, der die ‚Autos‘ Schlüssel enthält, und eine, die die tatsächliche CarEntity enthält. Leider kann man nicht innerhalb einer Karte auf einen einzigen Schlüssel beziehen und assign Typen auf nur diesen Schlüssel zu diesem Zeitpunkt. Im allgemeinen Typen auf Werte für Sammlungen Einstellung bezieht sich auf alle Werte innerhalb der Sammlung. Sie brauchen nicht auf die Typen für die erste Karte angeben, die den „Autos“ Schlüssel enthalten, da sie es standardmäßig deserialisiert werden.

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String,Map<String, CarEntity>>>()
    .use("values.values", CarEntity.class )
    .deserialize(json).get("cars");

Der Pfad ‚values.values‘ bezieht sich auf die Werte der äußeren Karte dann die nächsten Kartenwerte durchlaufen alle CarEntity Instanzen.

Ich habe die Pfadausdrücke betrachtet ändert ausdruck sein so dass Sie einen einzelnen Wert in einer Sammlung zielen, aber dies erhöht Aufwand für sich zu bewerten und ist rückwärtskompatibel ist eine Herausforderung.

Andere Tipps

Sie sind am ehesten von Java Type Erasure gebissen: JSON-Bibliothek in Frage, die Sie nicht wissen eingeben möchten; alles was man sieht, entspricht die Karte. So müssen Sie mindestens Wert Typ irgendwie angeben. Hoffentlich FlexJSON Dokumentation weist darauf hin, wie.

Alternativ können Sie auf der Unterklasse HashMap in Ihre eigene Art der Lage sein (MyEntityMap erstreckt HashMap), da dann Informationen eingeben kann von generischem Supertyp abgeleitet werden; und vorbei MyEntityMap.class würde Typinformationen geben, dass die meisten JSON-Bibliotheken verwenden können (Jackson und Gson zumindest).

Wenn diese nicht funktionieren, Jackson und Gson Bibliotheken können diesen Anwendungsfall behandeln leicht; beide Methoden müssen generische Typen für die Deserialisierung angeben.

Fügen Sie einfach einen weiteren Anruf zu get("cars") wie:

Map<String, CarEntity> deserialized = new JSONDeserializer<Map<String, CarEntity>>()
   .use("cars.values", Map.class)
   .deserialize(json).get("cars");

JSON-String wahrscheinlich aus einer Variablen cars serialisiert wurde als Map<String, CarEntity> getippt

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