2012-09-12 109 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();