Frage

ich habe ein Problem der Serialisierung eines Objekts unter Verwendung Gson.

@XmlRootElement
class Foo implements Serializable {
    private int number;
    private String str;

    public Foo() {
        number = 10;
        str = "hello";
    }
}

Gson wird serialisiert werden diese in eine JSON

{"number":10,"str":"hello"}.

Aber ich mag es sein

{"Foo":{"number":10,"str":"hello"}},

so grundsätzlich einschließlich der Top-Level-Element. Ich habe versucht, einen Weg zu Google dies in Gson zu tun, aber kein Glück. Wer weiß, ob es eine Möglichkeit, dies zu erreichen ist?

Danke!

War es hilfreich?

Lösung

Sie müssen das Element am oberen Rand des der Objektbaum hinzuzufügen. So etwas wie folgt aus:

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"}}

Andere Tipps

Statt des Typs hartzucodieren können Sie tun:

...
jo.add(Foo.getClass().getSimpleName(), je);

Ein besserer Weg, dies zu tun, ist eine Wrapper-Klasse zu erstellen und dann ein Objekt von Foo Inneres erstellen.

Beispielcode:

public class ResponseWrapper {

   @SerializedName("Foo")
   private Foo foo;

   public Foo getFoo() {
      return foo;
   }

   public void setFoo(Foo foo) {
      this.foo= foo;
   }
 }

Dann können Sie leicht zu JSON parsen mit:

new GsonBuilder().create().toJson(responseWrapperObj);

, die geben Ihnen die gewünschte Struktur:

{"Foo":{"number":10,"str":"hello"}}

Wenn Sie Jackson verwenden api die folgenden Zeilen verwenden

mapper.configure (SerializationFeature.WRAP_ROOT_VALUE, true); mapper.configure (DeserializationFeature.UNWRAP_ROOT_VALUE, true);

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top