【问题标题】:How to map multiple JSON responses to a single Java POJO?如何将多个 JSON 响应映射到单个 Java POJO?
【发布时间】:2019-08-11 19:04:17
【问题描述】:

需要将多种类型的 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 的通用方法。

【问题讨论】:

  • 基本上相同的响应必须设置在具有不同字段的两个 json 中。两个 json 中有什么共同的字段吗?
  • 没有通用字段名称
  • 感谢@cassiomolin 的回答。但建议没有按建议工作。我必须解析两个 POJO 并将值分配给一个常见的 POJO 以进行比较。

标签: java json spring-mvc jackson pojo


【解决方案1】:

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

由于两个响应似乎彼此完全不同,没有任何共同之处,因此我不会尝试使用单个类来读取两个响应。

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

  1. 您可以将两个响应解析为Map&lt;String, Object&gt;,然后将值映射到一个公共类。

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

【讨论】:

    【解决方案2】:

    它似乎没有任何通用的方式。但你可以这样做:

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

    【讨论】:

      【解决方案3】:

      我建议使用 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;
      
      }
      

      希望对你有帮助。

      【讨论】:

        【解决方案4】:

        我所做的是创建了一个 MyResponse 模型,其中基本上包含您期望获得的 JSON 响应中的所有响应字段。 MyResponse 有 c-tor 或接收这些字段或允许设置它们的设置器。

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

        然后你只需在某种经理类或任何你称之为的东西中做这样的事情:

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

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

        【讨论】:

          【解决方案5】:

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

           class XXX {
              @JsonAlias("accountName")
              @JsonProperty("ACCOUNT_NAME")
              private String name;
          
              @JsonAlias("routingNumber")
              @JsonProperty("ROUTING_NUMBER")
              private String routing;}
          

          希望对你有帮助。

          【讨论】:

            猜你喜欢
            • 2014-04-12
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-08-25
            • 1970-01-01
            • 2017-02-09
            • 2019-02-12
            • 2017-02-24
            相关资源
            最近更新 更多