如何将多个JSON响应映射到单个Java POJO?

时间:2019-08-11 19:04:17

标签: java json spring-mvc jackson pojo

需要将多种类型的JSON响应映射到单个POJO,以便我可以比较不同的对象以提供有关差异的见解。

我尝试将第一个响应映射到POJO,然后解析第二个响应以填充已定义的POJO:

    class XXX {
        @JsonProperty("accountHolder")
        private String accountHolder;
        @JsonProperty("routingNumber")
        private String routingNumber;
        @JsonProperty("balance")
        private List<Balance> balance;
        @JsonProperty("accountName")
        private String accountName;
        @JsonProperty("bankTransferCodeType")
        private String bankTransferCodeType;
        @JsonProperty("individualInformation")
        private IndividualInformation individualInformation;
        @JsonProperty("acctType")
        private String acctType;
        @JsonProperty("transactionList")
        private TransactionList transactionList;
        @JsonProperty("accountNumber")
        private String accountNumber;
        @JsonProperty("uniqueId")
        private String uniqueId;
        @JsonProperty("bankNetID")
        private String bankNetID;
        @JsonIgnore
        private Map<String, Object> additionalProperties = new HashMap<String, Object>();
    }

第一反应:


[
    {
        "ACCOUNT_NAME": "",
        "ACCOUNT_NUMBER": "",
        "AVAILABLE_BALANCE": null,
        "CURRENT_BALANCE": "",
        "FULL_ACCOUNT_NUMBER": null,
    }
]

第二反应:

"bankAccount": [
      {
        "accountName": "",
        "accountNumber": "",
        "routingNumber": "",
        "fullAccountNumber": "",
        "bankTransferCodeType": "",
        "acctType": "",
        "transactionList": {
          "transaction": [
            {
              "amount": {
                "curCode": "",
                "content": ""
              }
          ],
          "oldestTxnDate": ""
        },
        "uniqueId":
      }
}

期望将不同的结构化JSON实体映射到单个POJO的通用方法。

5 个答案:

答案 0 :(得分:2)

  

如何将多个JSON响应映射到单个Java POJO?

由于两个响应似乎彼此完全不同,没有什么共同点,所以我将避免尝试使用单个类来读取两个响应。

  

期望将不同的结构化JSON映射到单个POJO的通用方法。

  1. 您可以将两个响应都解析为Map<String, Object>,然后将值映射到公共类。

  2. 您可以创建单独的类来映射每个响应。它将允许您解耦并根据需要演化它们。从一个对象映射到另一个对象时,也可以使用mapping frameworks之类的MapStruct来减少样板代码。

答案 1 :(得分:1)

我建议使用Jackson Json Views。这是相同的示例:

示例

public class Views {

    public class Global {
    }

    public class Internal extends Global {
    }
}

class XXX {

    @JsonView(Views.Global.class)
    @JsonProperty("accountHolder")
    private String accountHolder;

    @JsonView(Views.Internal.class)
    @JsonProperty("routingNumber")
    private String routingNumber;

}

希望有帮助。

答案 2 :(得分:0)

它似乎没有通用的方法。但是您可以这样做:

  • 为每种响应类型创建多个域类
  • 创建一个标准域类
  • 为每个响应类创建映射器,以将其映射到标准域 类。您可以使用MapStruct reference here

答案 3 :(得分:0)

我所做的是创建了一个MyResponse模型,该模型基本上包含了您期望从JSON响应中获取的所有响应字段。 MyResponse可以控制或接收这些字段或设置器,以进行设置。

然后,我创建了一种服务类MyService,它可以发出多个请求并获得响应。

然后,您只需要在某种管理器类中或类似的名称中执行以下操作即可:

MyService mySer = new MyService();

MyResponse myRes = new MyResponse(
  mySer.getDetails(),
  mySer.getPicture(),
  mySer.getSomethingElse()
);

这些调用(getDetails,getPicture ...)将请求发送到端点并返回响应,然后将它们映射到MyResponse类构造函数的字段中。这是由框架发生的,因此MyResponse具有类型为FIELD的注解@XmlRootElement和@XmlAccessorType以确保发生这种情况。 如果出于某种原因,例如,您不想创建包含getPicture结果的响应,则只需将null分配给该imput参数即可。

答案 4 :(得分:0)

我建议使用@JsonProperty("") 和@JsonAlias("")。

 class XXX {
    @JsonAlias("accountName")
    @JsonProperty("ACCOUNT_NAME")
    private String name;

    @JsonAlias("routingNumber")
    @JsonProperty("ROUTING_NUMBER")
    private String routing;}

希望能帮到你。