使用GSON进行序列化时包括对象类型

时间:2014-09-30 10:25:00

标签: java json 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);
     }
}

然而,这个问题当然是在序列化基类型时我陷入无限递归。

还有其他方法可以解决这个问题吗?

3 个答案:

答案 0 :(得分: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());

Out put:

{"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\":",""));

Out put:

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

答案 1 :(得分:0)

只需子类化gson序列化程序并正常序列化对象。获得它后,使用内省获取类名,并将其设置为新映射的键,其值为gson的json对象。现在从自定义序列化方法返回此对象。

不要覆盖自定义序列化方法,jus创建一个使用原始序列化方法的新方法。

答案 2 :(得分:0)

为什么不在类对象树的顶部添加类名。你可以有这样的东西。

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