2017-08-02 3 views
0

Gibt es eine Möglichkeit, eine POJO-Klasse in Java zu erstellen, auf die diese JSON deserialisiert werden kann?Deserialisieren von Json mit inkonstantem Feld zu POJO in Java

{ 
    "name": "value", 
    "random-value-01" : { 
     "constant-field-00":"value_00", 
     "constant-field-01":"value_01" 
    }, 
    "random-value-02" : { 
     "constant-field-00":"value_02", 
     "constant-field-01":"value_03" 
    }, 
    ... 
    "random-value-XX" : { 
     "constant-field-00":"value", 
     "constant-field-01":"value" 
    }, 
} 
+1

Es sei denn, Sie möchten eine Karte verwenden. Aber ich frage mich, warum Sie es so formatieren. –

Antwort

1

Wenn alle Ihre random-value-x JsonObjects das gleiche Format haben (dh die beiden konstanten Felder gleich für jeden Modus sind), dann könnte man immer so etwas wie haben:

class RandomValue { 
    private final String constantField00; 
    private final String constantField01; 
    // ... Constructors, getters, etc. 
} 

class Pojo { 
    private final String name; 
    private final Map<String, RandomValue> randomValues; 
    // ... 
} 

Wenn sie bestellt werden (dh sie sind alle gleichenrandom-value, wie property-01, property-02, etc.), dann können Sie auch die Map ein List sein (oder Set, etc.) Ihrer RandomValue Elemente .


Wenn auf der anderen Seite sind die constant-field s auch alle zufälligen Schlüssel sind, dann sind Sie wahrscheinlich mit etwas mehr wie fest:

class Pojo { 
    private final String name; 
    private final Map<String, Map<String, String>> additionalInfo; 
    // ... 
} 

Wo die Schlüssel zum additionalInfoMap sind Ihre random-value-x s, und die Werte sind ein Map von String Schlüssel (constant-field-0x s) String Werte (value s).

0

Dies ist keine Antwort als solche, aber kann sein Interesse auf das allgemeine Thema wecken.

Für diejenigen, die an einem anderen Ansatz für JSON interessiert sind, kann man sich die ASN.1 der ITU ansehen. Betrachten Sie es als ein bisschen wie Google Protocol Buffers, aber mit einer ganzen Ladung verschiedener Drahtformate (einschließlich JSON, XML und einer ganzen Ladung von binären Drahtformaten mit unterschiedlichen Eigenschaften). Grundsätzlich gibt es ein Kabelformat für jeden Anlass und Zweck.

Dies kann manchmal sehr nützlich sein. Wenn Sie Daten um ein verteiltes System herum versenden möchten und Teile dieses Systems sind, sagen wir C auf einem Mikrocontroller am Ende einer Funkverbindung mit niedriger Bandbreite, während andere Teile Java auf einem Server sind, können Sie Ihr gesamtes System umfassen Nachrichtenübermittlung in einem einzigen Schema (das als einziger Punkt der Wahrheit fungiert). Daraus können Sie (abhängig von den Werkzeugen, die Sie verwenden) einfache alte Objekte in C, C++, Java, C# und sogar ADA, VHDL generieren. Python ist eine bemerkenswerte Unterlassung (es gibt Python-Module, um Code-First ASN1 zu tun, die den Punkt verfehlt).

Die Verwendung von JSON als Drahtformat ist eine relativ neue Ergänzung des Standards, aber einige der kommerziellen Tools unterstützen es. Für diejenigen, die es wirklich brauchen, kann es ein sehr nützliches Werkzeug sein.

Aus der Sicht dieser speziellen Frage sind ASN.1 und die Tools, die JSON als Drahtformat unterstützen, nicht sinnvoll; Sie können kein beliebiges JSON-Objekt verwenden und automatisch ein Schema generieren, das in Klassen kompiliert werden kann. Wo es sinnvoll ist, ist es in einem neuen Projekt, wo Sie es anderen Sprachen/Plattformen leicht machen wollen, Ihre Daten zu konsumieren oder zu generieren.

Ich habe nach anständigen C# -Klassengeneratoren gesucht, die JSON-Schemata verbrauchen; leider hat sich der beste da draußen nicht mit oneof beschäftigt. Die Tools, die ich für ASN.1 verwende (mit der Entsprechung CHOICE), generieren jedoch vollständige Klassen in C#, Java, C/C++. Ich bin also in dieser amüsanten Situation, in der ich ein ASN.1-Schema habe, das ich (in diesem speziellen Projekt) zu C# und C kompiliere, und es behandelt JSON, XML und die binären Drahtformate.Die generierten Klassen sind intelligent genug, um ihre eigene Validierung durchzuführen - ich muss den JSON nicht über einen JSON-Schema-Validator übergeben.

JSON-Schemas und ASN.1-Schemas sind weitgehend vergleichbar in Bezug auf die Details, die in eine Spezifikation aufgenommen werden können. Ähnlich sind ASN.1-Schema und XSD-XML-Schema weitgehend gleichwertig (es gibt sogar eine offizielle standardisierte Übersetzung zwischen den beiden Sprachen). Die Vorteile des ASN.1-Schemas anstelle des JSON- oder XSD-Schemas liegen darin, dass die Tools (insbesondere die kommerziellen Tools) wesentlich gründlicher zu sein scheinen als die Klassengeneratoren, die normalerweise mit JSON- und XSD-Schemas verknüpft sind (z. B. Microsofts xsd. exe saugt). Dies hat sich positiv auf die Systemintegration, die Wartung, die Agilität mit Datendefinitionen usw. ausgewirkt.

Verwandte Themen