我使用GSON反序列化JSON从POJO交涉对象。
我想在我的POJO的一个领域之一,包含任意JSON数据。 例如:
class B {
public String stringField;
public JsonObject jsonField;
}
我希望能够调用Gson.fromJson(json, B.class)
以下JSON:
{
"stringField": "booger",
"jsonField" :
{
"arbitraryField1": "foo"
}
}
和具有所得B.jsonField
包含一个JSONObject与arbitraryField
值的foo
。
然而,当我试图做到这一点, jsonField
始终是一个空对象( {}
事实上,越来越普遍,看来下面总是返回一个空的对象:
new Gson().fromJson("{ foo: 1 }", JsonObject.class)
我期望上述返回包含一个字段名为对象foo
的值1。
怎样才可以有反序列化JSON到POJO。当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();
考虑这个解串器,这是我的解释的文档 。
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());
}
}