在使用Gson进行序列化时如何公开类名

我的场景非常复杂,但这是一个总结:

我正在尝试理解编译器的来源 – 并且为了理解每个AST节点代表什么,我正在生成不同程序的AST的JSON序列化,然后检查可视化的JSON输出。

它工作得很好除了一个问题是在Gson生成的JSON数据类名称没有提到,所以它仍然没有多大帮助。 有没有办法在没有太多努力的情况下为Gson输出添加类名? (不向每个AST节点添加一些方法等)

您还可以使用Genson将对象的类名添加到输出的json中,只需执行以下操作:

Genson genson = new Genson.Builder().setWithClassMetadata(true).create(); String json = genson.serialize(yourNode); 

好处是它使您能够反序列化回到那些具体类型。 有关更多详细信息,请参阅Wiki 。

Gson提供了一个自定义序列化和描述对象的选项,通过实现接口JsonSerializer (用于序列化)和JsonDeserializer (用于descralizing),您可以忽略JSON字符串的某些部分(比如_class:com.example.SomeSourceClass )。

这也意味着通用/常规Gson isntance将无法读取您的JSON字符串。

这将是您问题的具体解决方案。

这是Gson用户指南

检查runtimeAdapter ,

  RuntimeTypeAdapter nodeAdapter = RuntimeTypeAdapter.create(Node.class,"type"); nodeAdapter.registerSubtype(Begin.class,"Begin"); nodeAdapter.registerSubtype(State.class,"State"); gsonBuilder.registerTypeHierarchyAdapter(Class.class, new GsonClassAdapter()) .registerTypeAdapter(Node.class,nodeAdapter ) .enableComplexMapKeySerialization().setPrettyPrinting(); gson = gsonBuilder.create();