簡體   English   中英

使用GSON進行序列化時包括對象類型

[英]Include object type when serializing using 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"  
           }  
       }
    }
}

我可以嘗試編寫一個自定義序列化程序來解決這個問題(假設一個等效的編譯器也是為嵌套編寫的):

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);
     }
}

然而,這個問題當然是在序列化基類型時我陷入無限遞歸。

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

你可以這樣試試

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"}}

只需子類化gson序列化程序並正常序列化對象。 獲得它后,使用introspection獲取類名,並將其設置為新映射的鍵,其值為gson的json對象。 現在從自定義序列化方法返回此對象。

不要覆蓋自定義序列化方法,jus創建一個使用原始序列化方法的新方法。

為什么不在類對象樹的頂部添加類名。 你可以有這樣的東西。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM