Comment renommer une clé racine dans la sérialisation JSON avec Jackson
Je suis à l'aide de Jackson pour la sérialisation JSON d'une liste d'objets.
Voici ce que j'obtiens:
{"ArrayList":[{"id":1,"name":"test name"}]}
Mais ce que je veux c' :
{"rootname":[{"id":1,"name":"test name"}]} //ie showing the string I want as the root name.
Voici ma démarche:
Interface:
public interface MyInterface {
public long getId();
public String getName();
}
Mise en œuvre de la classe:
@JsonRootName(value = "rootname")
public class MyImpl implements MyInterface {
private final long id;
private String name;
public MyImpl(final long id,final name) {
this.id = id;
this.name = name;
}
//getters
}
La sérialisation JSon:
public class MySerializer {
public static String serializeList(final List<MyInterface> lists) {
//check for null value.Throw Exception
final ObjectMapper mapper = new ObjectMapper();
mapper.configure(SerializationConfig.Feature.WRAP_ROOT_VALUE, true);
return mapper.writeValueAsString(lists);
}
}
Test:
final List<MyInterface> list = new ArrayList<MyImpl>();
MyImpl item = new MyImpl(1L,"test name");
list.add(item);
final String json = MySerializer.serializeList(list);
System.out.println(json);
Voici ce que j'obtiens:
{"ArrayList":[{"id":1,"name":"test name"}]}
Mais ce que je veux c' :
{"rootname":[{"id":1,"name":"test name"}]} //ie showing the string I want as the root name.
J'ai essayé toutes les solutions proposées que j'ai pu trouver, mais a échoué à atteindre mon objectif. J'ai regardé:
- Jackson : collection personnalisée de sérialisation JSON
- Comment puis-je renommer la racine de la clé d'un JSON avec Java Jackson?
- Jackson : collection personnalisée de sérialisation JSON
Ou ai-je raté quelque chose? Je suis à l'aide de jackson 1.9.12 pour cela. Toute aide à ce sujet est la bienvenue.
- essayez de sérialiser une instance de MyImpl pas une Liste de MyImpl. Le processus est en train de faire son travail depuis qu'il est à la recouvrant d'une Liste et non un MyInterface objet.
Vous devez vous connecter pour publier un commentaire.
Bien, par défaut Jackson utilise l'un des deux annotations lorsque vous essayez de déterminer le nom de la racine à afficher pour enveloppé valeurs -
@XmlRootElement
ou@JsonRootName
. Il s'attend à ce que l'annotation d'être sur le type de sérialisées, sinon il utilisera le simple nom de du type que le nom de la racine.Dans votre cas, vous êtes de la sérialisation d'une liste, c'est pourquoi le nom de la racine est 'ArrayList' (simple nom du type sérialisé). Chaque élément de la liste peut être annotée avec @JsonRootName, mais la liste elle-même n'est pas.
Lorsque la racine de la valeur que vous essayez de retour à la ligne est une collection, alors vous devez trouver un moyen de définir l'écharpe nom:
Titulaire/Classe Wrapper
Vous pouvez créer une classe wrapper pour contenir la liste, avec une annotation pour définir la propriété nom (vous ne devez utiliser cette méthode si vous n'avez pas le contrôle direct de la
ObjectMapper
/JSON processus de transformation):Objet Écrivain
C'est l'option préférable. Utiliser un configuré
ObjectWriter
exemple pour générer du JSON. En particulier, nous nous intéressons à lawithRootName
méthode:new ObjectMapper().enable(SerializationFeature.WRAP_ROOT_VALUE).writer().withRootName("rootName").writeValueAsString(lists)
Je sais, je suis en retard , mais j'ai une meilleure approche qui ne nécessitent pas Titulaire/Classe Wrapper. Il vient de la racine de la clé à partir de l'annotation.
Ici est la classe de test:-
Il va donner suite à la sortie
Vous avez besoin pour utiliser cette annotation en haut de la classe
@JsonTypeName("rootname")