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!

Était-ce utile?

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

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