我的场景非常复杂,但这里有一个摘要:
我试图了解编译器的源代码——为了了解每个 AST 节点代表什么,我正在生成不同程序的 AST 的 JSON 序列化,然后检查可视化的 JSON 输出。
它工作得很好,除了一个问题是在 Gson 生成的 JSON 数据类名称中没有提到,所以它仍然没有太大帮助。有没有办法毫不费力地将类名添加到 Gson 输出?(不向每个 AST 节点等添加一些方法)
Gson 提供了一个自定义序列化和反序列化对象的选项,通过实现接口JsonSerializer
(用于序列化)和JsonDeserializer
(用于反序列化),您可以忽略 JSON 字符串的某些部分(例如_class:com.example.SomeSourceClass
)。
这也意味着通用/常规 Gson 实例将无法读取您的 JSON 字符串。
这将是您问题的特定解决方案。
RuntimeTypeAdapter<Node> 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();