使用GSON反序列化包含JSON的对象

我正在使用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包含一个值为fooarbitraryField的JsonObject。

但是,当我尝试这样做时, jsonField始终是一个空对象( {} )。 事实上,更一般地说,以下似乎总是返回一个空对象:

 new Gson().fromJson("{ foo: 1 }", JsonObject.class) 

我希望上面的内容返回一个包含名为foo的值为1的字段的对象。

在将json反序列化为POJOS时,如何让gson保留任意json数据?

我能够通过引入一个包含JsonObject的包装器对象来解决这个问题,然后为该对象编写一个自定义反序列化器,它只返回原始的json。 但是,似乎必须有更好的方法。

对于后代,反序列化器和普通包装器对象如下所示:

 class MyJsonObjectWrapperDeserializer implements JsonDeserializer { @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 { 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()); } }