[英]Deserializing an object that contains JSON using GSON
我正在使用gson从JSON表示中反序列化POJO对象。
我希望我的一个POJO中的一个字段包含任意JSON数据。 例如:
class B {
public String stringField;
public JsonObject jsonField;
}
我希望能够在以下JSON上调用Gson.fromJson(json, B.class)
:
{
"stringField": "booger",
"jsonField" :
{
"arbitraryField1": "foo"
}
}
并使得结果B.jsonField
包含一个值为foo
的arbitraryField
的JsonObject。
但是,当我尝试这样做时, jsonField
始终是一个空对象( {}
)。 事实上,更一般地说,以下似乎总是返回一个空对象:
new Gson().fromJson("{ foo: 1 }", JsonObject.class)
我希望上面的内容返回一个包含名为foo
的值为1的字段的对象。
在将json反序列化为POJOS时,如何让gson保留任意json数据?
我能够通过引入一个包含JsonObject的包装器对象来解决这个问题,然后为该对象编写一个自定义反序列化器,它只返回原始的json。 但是,似乎必须有更好的方法。
对于后代,反序列化器和普通包装器对象如下所示:
class MyJsonObjectWrapperDeserializer implements JsonDeserializer<MyJsonObjectWrapper> {
@Override
public MyJsonObjectWrapper deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new MyJsonObjectWrapper(json.getAsJsonObject());
}
}
class MyJsonObjectWrapper {
public JsonObject json;
public MyJsonObjectWrapper(JsonObject json) {
this.json = json;
}
}
你可以使用JsonParser:
JsonParser parser = new JsonParser();
JsonObject o = parser.parse("{ \"foo\": \"1\" }").getAsJsonObject();
考虑一下这个反序列化器,这是我对doc的解释。
import com.google.gson.*;
import java.lang.reflect.Type;
class B {
public String stringField;
public JsonObject jsonField;
}
class BDeserializer implements JsonDeserializer<B> {
public B deserialize(JsonElement json, Type typeOfT,
JsonDeserializationContext context)
throws JsonParseException {
JsonObject jsonObject = json.getAsJsonObject();
B b = new B();
b.stringField = jsonObject.get("stringField").getAsString();
b.jsonField = jsonObject.getAsJsonObject("jsonField");
return b;
}
}
public class Test {
static public void main(String[] args) {
GsonBuilder gson = new GsonBuilder();
gson.registerTypeAdapter(B.class, new BDeserializer());
String json = " { \"stringField\" : \"booger\", \"jsonField\" : { \"arbitraryField1\" : \"foo\" } } ";
B b = gson.create().fromJson(json, B.class);
System.out.println(b.stringField);
System.out.println(b.jsonField.toString());
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.