7
votes

Jackson: sérialisation de la collection personnalisée à JSON

J'essaie de JSON-Serialize une classe MyrootClass avec une propriété qui est une collection d'éléments d'une seconde classe myClass: xxx pré>

Le code suivant: p>

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


0 commentaires

3 Réponses :


1
votes

Ce que vous voulez, c'est d'inclure le nom de la classe dans la sortie. Ce n'est pas la manière dont les sérialiszers JSON se comportent - ils n'incluent que des noms de champs.

Ce que vous pouvez faire est d'introduire une autre classe. P>

class MyClass implements MyInterface {
    private MyOtherClass myclass;
}

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


2 commentaires

Merci. C'est ce que j'essayais d'éviter, car j'utilise un modèle de classe hérité (je ne peux pas le modifier), mais je dois obtenir le format JSON (également une restriction imposée par un système tiers).


Vous pouvez envelopper le modèle de classe hérité à des fins de sérialisation.



7
votes

Cela dépend de ce que vous voulez exactement réaliser avec le nom; Mais oui, cela peut être fait si vous voulez inclure «myClass 'ici est ici des informations de type (ou peut agir comme s'il était utilisé; si vous n'utilisez pas Jackson pour désherialiser, cela n'a pas d'importance).

Si oui, vous annoteriez myInterface: xxx

et myclass avec: xxx

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

@jsontypeinfo ci-dessus définit que le nom de type doit être utilisé (nom de classe Java ou méthode personnalisée), et l'inclusion est effectuée par Utilisation d'un objet wrapper (les alternatives sont une matrice d'emballage et de la propriété AS)

Vous devez donc voir la sortie attendue.


0 commentaires

1
votes

Vous pouvez utiliser un objet assistant comme celui-ci:

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

}


0 commentaires