![](/img/trans.png)
[英]gson - How to include class name property when serializing object of any type
[英]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.