Frage

Ich versuche, json-serialize eine Klasse MyRootClass mit einer Eigenschaft, die eine Sammlung von Elementen einer zweiten Klasse MyClass ist:

public class MyRootClass {
   private List<MyInterface> list = new ArrayList<MyInterface>();
   // getter / setter
}

public class MyClass implements MyInterface {
   private String value = "test";    
   // getter / setter
}

Mit dem folgenden Code:

MyRootClass root = new MyRootClass();
root.getList().add(new MyClass());
ObjectMapper mapper = new ObjectMapper();
mapper.writeValue(System.out, root);

Erzeugt diese JSON Ausgabe:

{"list": [ {"value":"test"} ] }

statt, was ich brauche, jedes Objekt in der Sammlung mit einem Namen serialisiert:

{"list": [ {"myclass": {"value":"test"}} ] }

Gibt es eine Möglichkeit, es Jackson mit zu erreichen? Ich dachte über einen benutzerdefinierten Serializer zu schreiben, aber ich habe nicht alles im Zusammenhang mit einer Sammlung von Objekten gefunden.

War es hilfreich?

Lösung

Es hängt davon ab, was genau wollen Sie mit dem Namen erreichen; aber ja, kann dies geschehen, wenn Sie möchten, schließen ‚myclass‘ hier Typinformationen (oder handeln, als ob es verwendet wurde, und wenn du Jackson nicht verwenden deserialisieren es nicht wirklich wichtig).

Wenn ja, würden Sie annotate MyInterface:

@JsonTypeInfo(use=Id.NAME, include=As.WRAPPER_OBJECT)

und MyClass mit:

@JsonTypeName("myclass")

(wenn Sie nicht, dass definieren, würde Standardname nicht qualifizierte Namen der Klasse sein)

@JsonTypeInfo oben definiert, die Typnamen verwendet werden soll (anstelle von Java-Klassennamen oder benutzerdefinierte-Methode), und die Aufnahme wird unter Verwendung eines Hüllenobjekt durchgeführt (Alternativen sind Wrapper-Array und as-Eigenschaft)

So sollten Sie dann erwartete Ausgabe sehen.

Andere Tipps

Was Sie wollen, ist der Name der Klasse in der Ausgabe enthalten. Dies ist nicht, wie json Serializer verhalten -. Sie nur Feldnamen enthalten

Was können Sie tun, ist eine andere Klasse einzuführen.

class MyClass implements MyInterface {
    private MyOtherClass myclass;
}

class MyOtherClass {
    private String value = "test";
}

Sie können einen Helfer-Objekt verwenden, wie folgt aus:

public static class MyObject {
    public int i;
    public MyObject(int i) { this.i = i; }
    public MyObject() {}
}

@JsonDeserialize(contentAs=MyObject.class)
public static class MyHelperClass extends ArrayList<MyObject> {

}

@Test
public void testCollection() throws JsonGenerationException, JsonMappingException, IOException {
    final Collection<MyObject> l = new ArrayList<MyObject>();
    l.add(new MyObject(1));
    l.add(new MyObject(2));
    l.add(new MyObject(3));

    final ObjectMapper mapper = new ObjectMapper();

    final String s = mapper.writeValueAsString(l);
    final Collection<MyObject> back = mapper.readValue(s, MyHelperClass.class);

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