Gson serialize POJO mit Root-Wert enthalten?
-
30-09-2019 - |
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!
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);