2014-09-30 52 views
3
序列化時包含對象類型

比方說,我有一些基本的類型:使用GSON

public class Base { 
    String a = "a"; 
    Nested nested = new Nested() 
} 

public class Nested { 
    String b = "b", 
} 

與GSON連載,我得到:

{ 
    "a": "a", 
    "nested": { 
     "b": "b"  
    } 
} 

這一切都很好,但如果我想要保留的對象類型以及如下,根據以下內容:

{ 
    "Base": 
    { 
     "a": "a", 
     "nested": { 
      "Nested": { 
       "b": "b" 
      } 
     } 
    } 
} 

我可以嘗試編寫自定義序列化程序來解決t他(只是假設等效一個嵌套的筆試和):

new JsonSerializer<Base>() { 
    @Override 
    public JsonElement serialize(Base src, Type typeOfSrc, JsonSerializationContext context) { 
     Map<String, Base> selfMap = new HashMap<>(); 
     selfMap.put(src.getClass().getSimpleName(), src); 
     return context.serialize(selfMap); 
    } 
} 

與此問題,但是,當然是序列化的基礎類型時,我就會陷入無限循環的。

有沒有其他方法可以解決這個問題?

回答

0

只是子類化gson串行器並正常序列化對象。一旦擁有了它,使用自省獲取類名並將其設置爲新值的關鍵字,其值爲gson的json對象。現在從你的自定義序列化方法返回這個對象。

不重寫自定義序列化方法,創建一個使用原始序列化方法的新的方法。

0

爲什麼不在對象樹頂部添加類名稱。你可以有這樣的事情。

Gson gson = new Gson(); 
JsonElement je = gson.toJsonTree(new Base()); 
JsonObject jo = new JsonObject(); 
jo.add(Base.class.getSimpleName(), je); 
+0

我知道,但這樣做的問題是,它只能處理在樹的頂部的對象,而不是嵌套的人。這不是我的問題,我會更新它。 – csvan 2014-09-30 10:37:01

1

您可以嘗試以這種方式

Base base = new Base(); 
base.a="a"; 
base.b="b"; 

Gson gson = new Gson(); 
JsonElement je = gson.toJsonTree(base); 
JsonObject jo = new JsonObject(); 
jo.add(Base.class.getName(), je); 
System.out.println(jo.toString()); 

輸出地說:

{"Base":{"a":"a","b":"b"}} 

編輯:

在這個問題你的編輯。

您可以Genson

Base base = new Base(); 
base.a="a"; 
base.nested=new Nested(); 

Genson genson = new Genson.Builder().setWithClassMetadata(true).create(); 
String json = genson.serialize(base); 
System.out.println(json.replaceAll("\"@class\":","")); 

出盡量放:

{"Base","a":"a","nested":{"Nested","b":"b"}} 
+0

謝謝,但如果我有嵌套的對象,這將無法工作 - 只有頂級實例纔會被標記。我已經更新了這個問題來證明這一點。 – csvan 2014-09-30 10:40:45

+0

@chrsva好的。提供具有嵌套對象的對象。你的問題不給,要我 – 2014-09-30 10:41:30

+0

問題已更新 – csvan 2014-09-30 10:44:37