Gson serialize POJO avec la valeur racine inclus?
-
30-09-2019 - |
Question
Je vais avoir un problème sérialisation d'un objet à l'aide Gson.
@XmlRootElement
class Foo implements Serializable {
private int number;
private String str;
public Foo() {
number = 10;
str = "hello";
}
}
Gson sérialise cela dans un JSON
{"number":10,"str":"hello"}
.
Cependant, je veux que ce soit
{"Foo":{"number":10,"str":"hello"}}
,
y compris essentiellement l'élément de niveau supérieur. J'ai essayé de google une façon de le faire dans Gson, mais pas de chance. Tout le monde sait s'il y a un moyen d'y parvenir?
Merci!
La solution
Vous devez ajouter l'élément au sommet du l'arborescence d'objets. Quelque chose comme ceci:
Gson gson = new Gson();
JsonElement je = gson.toJsonTree(new Foo());
JsonObject jo = new JsonObject();
jo.add("Foo", je);
System.out.println(jo.toString());
// Prints {"Foo":{"number":10,"str":"hello"}}
Autres conseils
Au lieu de coder en dur le type que vous pouvez faire:
...
jo.add(Foo.getClass().getSimpleName(), je);
Une meilleure façon de le faire est de créer une classe wrapper puis créer un objet de Foo
à l'intérieur.
Exemple de code:
public class ResponseWrapper {
@SerializedName("Foo")
private Foo foo;
public Foo getFoo() {
return foo;
}
public void setFoo(Foo foo) {
this.foo= foo;
}
}
Ensuite, vous pouvez facilement analyser à l'aide de JSON:
new GsonBuilder().create().toJson(responseWrapperObj);
qui vous donnera la structure souhaitée:
{"Foo":{"number":10,"str":"hello"}}
Si vous utilisez Jackson api utiliser les lignes ci-dessous
mapper.configure (SerializationFeature.WRAP_ROOT_VALUE, true); mapper.configure (DeserializationFeature.UNWRAP_ROOT_VALUE, true);