2017-06-27 9 views
1

Lassen Sie mich sagen, ich habe eine Item-Schnittstelle mit drei Implementierungen (kann auch eine abstrakte Klasse sein, wenn dies helfen würde).Deserialisieren JSON in polymorphe Typen durch Eigenschaft Existenz mit Jackson

interface Item { 

    String getId(); 

    // ... 
} 

class TextItem implement Item { 

    TextItem(String id, String text) { 
     // ... 
    } 

    // ... 
} 

class NumberItem implement Item { 

    NumberItem(String id, Integer number) { 
     // ... 
    } 

    // ... 
} 

class FlagItem implement Item { 

    FlagItem(String id, Boolean flag) { 
     // ... 
    } 

    // ... 
} 

Ist es möglich, die Einrichtung Jackson so dass es eine Instanz entsprechende Umsetzung auf der Grundlage der Existenz von Eigentum relevant für bestimmte Elementtyp schaffen würde?

Bitte beachten Sie den Schlag JSON Beispiel hat jedes Element eine andere zweite Eigenschaft: Text, Nummer oder Flagge. Jede dieser Eigenschaften speichert auch einen anderen Datentyp.

Wie kann ich deserialisieren, ohne die JSON-Struktur zu ändern, und idealerweise ohne einen benutzerdefinierten if-else-basierten Deserializer zu schreiben?

{ 
    "items": [ 
     { 
      "id": "item-1", 
      "text": "some text" 
     }, 
     { 
      "id": "item-2", 
      "number": 12345 
     }, 
     { 
      "id": "item-3",, 
      "flag": true 
     } 
    ] 
} 

Datentypen, die für die zweite Item-Eigenschaft ausgewählt wurden, sind nur ein Beispiel. Sie könnten auch ein benutzerdefinierter Typ oder eine Sammlung sein. Der Punkt ist, wie man Jackson so einrichtet, dass es die geeignete Item-Implementierung entweder durch Konstruktor-Argumenttypen oder durch das Vorhandensein eines für einen gegebenen Item-Typ spezifischen Eigenschaftsnamens verwendet.

+0

Wenn dies mit der aktuellen JSON-Struktur nicht möglich ist, wäre es, wenn die zweite Eigenschaft die gleichen Namen in JSON geteilt halten gerade einen anderen Wert Typen? – topr

+0

[Dies] (https://stackoverflow.com/a/12459070/823393) kann helfen. Ich habe vor einiger Zeit so etwas gebraucht und das Problem gelöst. – OldCurmudgeon

Antwort

Verwandte Themen