Question

Je suis en train de JSON-serialize une MyRootClass de classe avec une propriété qui est une collection d'éléments d'une deuxième classe MyClass:

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

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

Le code suivant:

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

Génère cette sortie JSON:

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

au lieu de ce que je dois, chaque objet de la collection sérialisé avec un nom:

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

Est-il possible d'y parvenir en utilisant Jackson? Je pensais à écrire un sérialiseur personnalisé, mais je ne l'ai pas trouvé quoi que ce soit lié à une collection d'objets.

Était-ce utile?

La solution

Cela dépend exactement ce que vous voulez atteindre avec le nom; mais oui, cela peut être fait si vous voulez inclure « maclasse » est une information de type ici (ou peut agir comme si elle était utilisée, si vous ne l'utilisez Jackson désérialiser il ne compte pas vraiment).

Si oui, vous le feriez annoter MyInterface:

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

et MyClass avec:

@JsonTypeName("myclass")

(si vous ne définissez pas, le nom par défaut serait nom non qualifié de la classe)

@JsonTypeInfo ci-dessus définit ce nom de type doit être utilisé (au lieu de nom de classe Java ou méthode personnalisée), et l'inclusion se fait à l'aide d'un objet wrapper (alternatives sont wrapper tableau et en-propriété)

Vous devriez alors voir les résultats attendus.

Autres conseils

Ce que vous voulez est d'inclure le nom de la classe dans la sortie. Ce n'est pas comment se comporter serializers JSON -. Ils ne comprennent que les noms de champs

Qu'est-ce que vous pouvez faire est d'introduire une autre classe.

class MyClass implements MyInterface {
    private MyOtherClass myclass;
}

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

Vous pouvez utiliser un objet d'aide comme ceci:

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);

}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top