Java Gson泛型反序列化JSON
我想使用Gson构建一个websocket客户端。 正如预期的那样,websocket通信基于几个不同的消息 我希望有一种优雅的方式将JSON字符串转换为声明的模型/对象 第一次尝试:Java Gson泛型反序列化JSON,java,json,gson,Java,Json,Gson,我想使用Gson构建一个websocket客户端。 正如预期的那样,websocket通信基于几个不同的消息 我希望有一种优雅的方式将JSON字符串转换为声明的模型/对象 第一次尝试: if message.contains("fieldA") { return gson.fromJson(message, ObjectA.class); } else if message.contains("fieldB") { return gson.
if message.contains("fieldA") {
return gson.fromJson(message, ObjectA.class);
} else if message.contains("fieldB") {
return gson.fromJson(message, ObjectB.class);
} else if message.contains("fieldC") {
return gson.fromJson(message, ObjectC.class);
}
// etc
第二次尝试,我看到了泛型和任意类型的解决方案,但与第一次尝试非常相似。我需要声明类型,而不是区分类。这在书面代码中非常相似
我认为更容易拥有和维护的是,在某个包中声明消息的模型,并拥有其中一个实现
fromJson
有这样或那样的方法来实现更优雅的解决方案吗?由于“contains”操作需要线性复杂度搜索,我认为通用解决方案不会有效(与使用鉴别器类型字段的
RuntimeTypeAdapterFactory
不同),但它可能是这样实现的:
@allargsconstuctor(access=AccessLevel.PRIVATE)
公共最终类JsonElementTypeAdapterFactoryBuilder{
私有最终类基类;
私有最终收集规则=新建ArrayList();
公共静态JsonElementTypeAdapterFactoryBuilder构造(最终类baseType){
返回新的JsonElementTypeAdapterFactoryBuilder(baseType);
}
公共JsonElementTypeAdapterFactoryBuilder寄存器(最后一句话)谢谢你的详细回答。但你的解决方案似乎使实现比一组if..else
表达式更冗长,更难维护。但看看我的问题,我可能会问一些不可能或难以实现的问题。@PauloOliveira是的,Gson只是一个基础,也是你能做的最多的我们可以实现一个通用的解决方案(并可能将其共享给其他人)或使用一个特殊的解决方案(可能使用codegen)。如果您希望它“不那么冗长”,您可以牺牲一些性能并注册第一个示例中的规则,仍然将其集中并在反序列化级别完成(在引擎盖下隐藏所有详细信息)。手动if/else-s很难维护,除非您有codegen。