2012-12-20 25 views
0

我知道如何實現JsonDeserializer和JsonSerializer,但這裏是我想做的事:的Java:GSON定製串行器和解串特殊要求

這是設置:

public class classA 
{ 
public String a; 
public classB clazzB; 
} 

public class classB 
{ 
public String c; 
public String d; 
public String e; 
public String f; 
} 

我想序列(和反序列化模擬到這一點)CLASSA這樣的:

  • 序列化CLASSA當它應該藏漢序列CLASSB的一部分與它,說變量c和d

因爲我知道該怎麼做(用短暫的e和f)這裏是漁獲:

  • c和d(應與ClassA的序列化CLASSB的部分)不應該在一個JSONObject,他們倒是應該出現INLINE與變量從ClassA的

本質的結果應該是這個樣子:

{"a":"something","c":"something", "d":"something"} 

我在這裏使用JsonSerializer的問題是有2個變量(可能更多),我必須從classB序列化。如果只有一個,那麼我可以返回一個變量的JSONPrimitive。我正在考慮在序列化方法中使用JsonTreeWriter,但我懷疑這是可以做到的。

什麼是最優雅的方式來做到這一點?

回答

0

除了「你做錯了」,因爲你基本上說你不想序列化你的對象到實際的JSON等價物中......你不序列化classB,因爲那不是你想要的。你想要一個JSON對象來自兩個對象的字段。

您可以爲A編寫自定義的Deserializer和Serializer,並創建您嘗試創建的JSON。

class ClassA 
{ 
    public String a = "This is a"; 
    public ClassB clazzB = new ClassB(); 
} 

class ClassB 
{ 
    public String c = "This is c"; 
    public String d = "This is d"; 
    public String e; 
    public String f; 
} 


class ASerializer implements JsonSerializer<ClassA> 
{ 

    public JsonElement serialize(ClassA t, Type type, JsonSerializationContext jsc) 
    { 
     JsonObject jo = new JsonObject(); 
     jo.addProperty("a", t.a); 
     jo.addProperty("c", t.clazzB.c); 
     jo.addProperty("d", t.clazzB.d); 
     return jo; 
    } 

} 

public class Test 
{ 
    pubic static void main(String[] args) 
    { 
     GsonBuilder gson = new GsonBuilder(); 
     gson.registerTypeAdapter(ClassA.class, new ASerializer()); 
     String json = gson.create().toJson(new ClassA()); 
     System.out.println(json); 
    } 
} 

輸出:

{ 「一個」: 「這是一個」, 「C」: 「這是C」, 「d」: 「這是d」}

您也可以在該序列化程序中使用序列化ClassB的路線,添加ClassA中的元素並返回該元素。