2012-09-12 32 views
4

我使用gson从JSON表示反序列化POJO对象。使用GSON反序列化包含JSON的对象

我想在我的一个POJO中的某个字段包含任意的JSON数据。例如:

class B { 
    public String stringField; 
    public JsonObject jsonField; 
} 

我希望能够调用Gson.fromJson(json, B.class)以下JSON:

{ 
    "stringField": "booger", 
    "jsonField" : 
    { 
     "arbitraryField1": "foo" 
    } 
} 

,并有导致B.jsonField包含一个JSONObject与价值fooarbitraryField

但是,当我尝试这样做时,jsonField始终是一个空对象({})。事实上,越来越普遍,看来下面总是返回一个空对象:

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

我希望上述返回包含字段的对象命名的值为1

foo怎样才可以有gson在将json反序列化为POJOS时保留任意的json数据?

回答

3

我能够通过引入一个包含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; 
    } 
} 
1

考虑这个解串器,这是我的the 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()); 
    } 
} 
+0

当然,我可以写一个自定义解串器。这基本上是我在我提出的解决方法中所做的。但它看起来像一个黑客。如果有一种不涉及定制解串器的方式会更好一些 – emmby

+0

我正在研究这个问题,并且在我发布时没有看到您的答案。最初的问题并没有表明你知道自定义的反序列化器,并且正在寻找更优雅的东西。从文档看来,这似乎是标准方法。 –

2

您可以使用JsonParser:

JsonParser parser = new JsonParser(); 
JsonObject o = parser.parse("{ \"foo\": \"1\" }").getAsJsonObject();