2017-09-26 1 views
0

Ich habe ein einfaches Problem, das mich jetzt zu lange dauert, um herauszufinden.Deserialize Liste auf bestimmte Eigenschaft

Ich will das deserialisieren:

[ 
    { "a": "a", "b": 1 } 
    { "a": "b", "b": 2 } 
] 

In diese:

@Data 
public class MyObject { 
    private List<BaseType> rootList; 
} 

Der Grund, warum ich dies tun möchte, ist, weil ich vorher nur Arraylist erstreckte, wurde aber jetzt brauche ich wirklich eine echte Klasse dass er es erben muss, damit ich das nicht mehr tun kann. Ich brauche im Grunde nur Jackson, um dieses innere Eigentum zu bevölkern, anstatt dass ich die Klasse einpacken muss.

Gibt es eine Anmerkung, die das tut?

Vielen Dank!

+0

Add Basetype Klassencode –

Antwort

1

Wenn Ihre Frage richtig ist, möchten Sie JSer-Array in Objekt mit Arrayfeld deserialisieren, das alle JSON-Arrayelemente enthält. Eine Sache, die Sie tun könnten, ist benutzerdefinierte Konstruktor erstellen und mit @JsonCreator kommentieren. Für die Serialisierung können Sie @JsonValue über Ihrem Listenfeld rootList verwenden.

private static String json = "[{\"a\":\"a\",\"b\":1},{\"a\":\"b\",\"b\":2}]"; 
@Data 
public static class MyObject { 
    @JsonValue // used during serialization 
    private List<BaseType> rootList; 
    @JsonCreator //used during deserialization 
    public MyObject(List<BaseType> items) { 
     this.rootList = items; 
    } 
} 

@Data 
public static class BaseType { 
    @JsonProperty 
    private String a; 
    @JsonProperty 
    private int b; 
} 

public static void main(String[] args) throws Exception { 
    ObjectMapper mapper = new ObjectMapper(); 
    MyObject value = mapper.readValue(json, MyObject.class); 
    System.out.println(value); 
    System.out.println(mapper.writeValueAsString(value)); 
} 
+0

Gibt es keine andere Möglichkeit, es anders als erstellen Sie einen neuen Konstruktor mit @JsonCreator zu tun? Dies ist eine ziemlich gute Lösung, es ist im Grunde genau das, was ich wollte, haben Sie es getestet, um sicherzustellen, dass es deserialize richtig? Ich werde es gerade jetzt testen. –

+0

Da diese Antwort etwas verzögert war, habe ich einen benutzerdefinierten Deserializer erstellt, der eine Root-Liste wie diese auf dem Feld mit einer benutzerdefinierten Annotation deserialisiert. Und dann habe ich eine benutzerdefinierte Annotation mit @JacksonInside mit @JsonDeserializer (mit = MyCustomDeserializer.class) gemacht ... Obwohl ich eine Lösung mit nativen Jackson-Annotationen mag, muss ich mir keine Gedanken über Randfälle im Deserializer machen. –

+0

@ A.Bello war für einige Zeit weg, so Entschuldigung für die Verzögerung. Ja, es sollte funktionieren, so wie du es erwartet hast. '@ JsonDeserializer' ist auch eine nette Option, besonders wenn Sie den POJO-Code in keiner Weise ändern können, zB wenn POJO Teil der 3-d Party-Bibliothek ist, können Sie' @ JsonDeserializer' mit Mixin verwenden, aber diesen Ansatz nicht verwenden. Und ja, Sie müssen @JsonCreator über dem benutzerdefinierten Konstruktor haben oder die 2. Option verwendet die statische Factory-Funktion. [Hier finden Sie weitere Informationen] (http://www.cowtowncoder.com/blog/archives/2011/07/entry_457.html) – varren

Verwandte Themen