【问题标题】:Creating complex JSON payload from Java Pojo Jackson从 Java Pojo Jackson 创建复杂的 JSON 有效负载
【发布时间】:2021-07-23 11:18:45
【问题描述】:

我想在 JSON 负载下创建

{
 "maxResults":3,
 "counter":0,
 "customerParameters":{
    "filters":[
        {
            "name":"customerId",
            "operator":"=",
            "value":["hello"]
        }
        ]
 },
"dealerParameters":[
    {
        "name":"club"
    },
     {
        "name":"token"
    }
    ]
 }

编码至今:

 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({
   "maxResults",
   "counter",
   "customerParameters",
   "dealerParameters"
})
public class CustomerModel {

 @JsonProperty("maxResults")
 private Integer maxResults;
 @JsonProperty("counter")
 private Integer counter;
 @JsonProperty("customerParameters")
 private CustomerParameters customerParameters;
 @JsonProperty("dealerParameters")
 private List<DealerParameter> dealerParameters = null;

 @JsonProperty("customerParameters")
 public CustomerParameters getCustomerParameters() {
  return customerParameters;
  }
 @JsonProperty("customerParameters")
 public void setCustomerParameters(CustomerParameters customerParameters) {
   this.customerParameters = customerParameters;
 }
 @JsonProperty("dealerParameters")
 public List<DealerParameter> getDealerParameters() {
  return dealerParameters;
 }
 @JsonProperty("dealerParameters")
 public void setDealerParameters(List<DealerParameter> dealerParameters) {
  this.dealerParameters = dealerParameters;
 } 
  // Getter/Setter for other params
    }

CustomerParameters.java

 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({
 "filters"
 })
 public class CustomerParameters {
 @JsonProperty("filters")
 private List<Filter> filters = null;
  // Setter and Getter for filters parameter
}

DealerParameters.java

 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({
 "name"
 })
 public class DealerParameter {
  @JsonProperty("name")
  private String name;
  @JsonProperty("name")
  public String getName() {
  return name;
  }
  @JsonProperty("name")
  public void setName(String name) {
  this.name = name;
  }
 }

过滤器.java

 @JsonInclude(JsonInclude.Include.NON_NULL)
 @JsonPropertyOrder({
  "name",
  "operator",
  "value"
 })
 public class Filter {

 @JsonProperty("name")
 private String name;
 @JsonProperty("operator")
 private String operator;
 @JsonProperty("value")
 private List<String> value = null;

 @JsonProperty("value")
 public List<String> getValue() {
 return value;
 }
 @JsonProperty("value")
 public void setValue(List<String> value) {
 this.value = value;
 }
 // Setter and Getter for other properties
}

缺少的部分:

   @Controller
   public class TestContoller {
     RestTemplate restTemplate;
         
  1. 我应该用下面的 new 运算符实例化每个 pojo 类并设置所有必需的参数吗?或任何其他创建 JSON 有效负载的方法?

          CustomerModel customerModel= new CustomerModel();
            customerModel.setMaxResults(1);
          Filter filter= new Filter();
            filter.setName("customerID");
            filter.setOperator("-");
            filter.setValue(Arrays.asList("club"));
          CustomerParameters customerParameters = new CustomerParameters();
            customerParameters.setFilters(Arrays.asList(filter));
          customerModel.setCustomerParameters(customerParameters); 
    
  2. 对于 DealerParameter 类,我想用 same key 不同的值创建多个对象(参见我上面提到的 json 有效负载)。下面的代码只创建一个对象 "name":"dealerId"

          DealerParameter dealerParameter = new DealerParameter();
           dealerParameter.setName("dealerId");
           customerModel.setDealerParameters(dealerParameter);
    
           ObjectMapper objectMapper = new ObjectMapper();
             objectMapper.writeValueAsString(customerModel);
      restTemplate.exchange(todo); // restful service call
    

    }

【问题讨论】:

  • 您可以使用工厂模式来封装细节,从而减少实例化 CustomerModel 对象的样板代码
  • 您是否考虑尝试使用@ConfigurationProperties 创建您的customerModel 对象?这可能不是最好的方法,但可能会有所帮助。
  • @Nikolai。你能提供一些参考吗?

标签: java json spring-boot jackson


【解决方案1】:

您已经在使用“ObjectMapper”,并且 ObjectMapper 有 readValue() 方法。通过使用 readValue() 方法,您可以一次填充所有数据,如下所示:--

ObjectMapper objectMapper = new ObjectMapper();

 //populating data from json string to POJO  
 CustomerModel  customerModel = objectMapper.readValue(<json String>,CustomerModel.class);

 System.out.println(objectMapper.writeValueAsString(customerModel); // print all data

【讨论】:

    猜你喜欢
    • 2020-11-14
    • 2020-11-06
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多