Java Gson泛型反序列化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.

我想使用Gson构建一个websocket客户端。 正如预期的那样,websocket通信基于几个不同的消息

我希望有一种优雅的方式将JSON字符串转换为声明的模型/对象

第一次尝试:

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
  • 在某个地方注册受支持的模型,这样我就可以像执行gson.fromJson(messageString)

  • 有这样或那样的方法来实现更优雅的解决方案吗?

    由于“contains”操作需要线性复杂度搜索,我认为通用解决方案不会有效(与使用鉴别器类型字段的
    RuntimeTypeAdapterFactory
    不同),但它可能是这样实现的:

    @allargsconstuctor(access=AccessLevel.PRIVATE)
    公共最终类JsonElementTypeAdapterFactoryBuilder{
    私有最终类基类;
    私有最终收集规则=新建ArrayList();
    公共静态JsonElementTypeAdapterFactoryBuilder构造(最终类baseType){
    返回新的JsonElementTypeAdapterFactoryBuilder(baseType);
    }
    
    公共JsonElementTypeAdapterFactoryBuilder寄存器(最后一句话)谢谢你的详细回答。但你的解决方案似乎使实现比一组
    if..else
    表达式更冗长,更难维护。但看看我的问题,我可能会问一些不可能或难以实现的问题。@PauloOliveira是的,Gson只是一个基础,也是你能做的最多的我们可以实现一个通用的解决方案(并可能将其共享给其他人)或使用一个特殊的解决方案(可能使用codegen)。如果您希望它“不那么冗长”,您可以牺牲一些性能并注册第一个示例中的规则,仍然将其集中并在反序列化级别完成(在引擎盖下隐藏所有详细信息)。手动if/else-s很难维护,除非您有codegen。