具有公共字段的不同 api 的 POJO 声明

Posted

技术标签:

【中文标题】具有公共字段的不同 api 的 POJO 声明【英文标题】:POJOs declaration for different api with common fields 【发布时间】:2021-09-05 09:38:08 【问题描述】:

我需要为我必须在我的微服务中调用的几个 API 创建响应 POJO 类。响应具有下面给出的基本结构。


    "requestId": "abcd-1234-3456",
    "sourceSystem": "HOME",
    "response": 
        "statusCode": "200",
        "statusMessage": "Successfully Received",
        "statusType": "SUCCESS",
        "details": [
            
             "message" : "hi"
            
        ]
    

这里的“details”属性数组中的对象可以变化并且可以有不同的类定义。有人可以帮助我是否应该如何声明我的 POJO,以便公共字段有一个公共类,而详细信息属性中的对象有一组不同的类。我尝试了几种使用 java 泛型和 @JsonSubType 的方法,但在反序列化过程中出现了一些错误 Unrecognized field "details"

【问题讨论】:

【参考方案1】:

对于给定的 json,您应该创建两个带有这些字段的 pojo,如下所示

Class UserResponse
    private String requestId,
    private String sourceSystem,
    private Response  response;

   //getter 
   //setter

现在创建内部 pojo 响应为

class Response
 private String requestId;
 private String statusMessage;
 private String statusType;
 private List<Object> details;
   //getter 
   //setter
 

如果您是 json 对象解析的新手,那么您可以使用 Gson 库。您需要先创建 Gson 对象,然后使用 fromJson() 方法作为

Gson gson = new Gson();

UserResponse userResponse = gson.fromJson(json, UserResponse.class);

来源:How to convert JSON to Java Object

【讨论】:

我将如何告诉杰克逊映射器对象的定义? @AnkitSinha 和大家分享了如何使用 gson 从 json 创建 pojo【参考方案2】:

您为什么不尝试将其定义为对象:-

class Response
 private String requestId;
 private String statusMessage;
 private String statusType;
 private List<Object> details;
 

【讨论】:

我将如何告诉杰克逊映射器对象的定义?

以上是关于具有公共字段的不同 api 的 POJO 声明的主要内容,如果未能解决你的问题,请参考以下文章

组合两个查询集,具有不同值的公共字段

对于控制器中的某些用户,公共字段是不是具有不同的值? [复制]

如何加入具有不同 CONTENT_ITEM_TYPE 但共享一个公共字段的记录,即 RAW_CONTACT_ID?

多态与公共字段的类型

hibernate框架学习之数据模型-POJO

有没有办法从 javascript 类声明中反映公共实例类字段?