【问题标题】:How to correctly map a JSON structure to an object?如何正确地将 JSON 结构映射到对象?
【发布时间】:2022-02-01 07:30:33
【问题描述】:

如何正确地将以下结构映射到对象 有 JSON:

{"store": [{
      "id":"100",
      "products": {
         "prod1":["price","quantity"],   //Maximum 2 elements
         "prod2":["price","quantity"],   //Maximum 2 elements
         "prod3":["price","quantity"]    //Maximum 2 elements
         //There may be many (known or not..prod4, prod5....)
        }}]}

类:

@Data
@NoArgsConstructor
public class Store {

    @JsonProperty("store")
    private Set<Stores> stores;
}

@Data
@NoArgsConstructor
public class Stores {

    @JsonProperty("id")
    private int id;

    @JsonProperty("products")
    private Set<Products> productsSet;
}    

@Data
@NoArgsConstructor
public class Products {
    ??????
}

我需要如何在产品类中写作?

映射器:

//omit exceptions and other code
public Store toStoreFromJson(String str) {
    ObjectMapper mapper = new ObjectMapper();
    return mapper.readValue(str, Store.class);

}

【问题讨论】:

  • 由于产品的密钥似乎是任意的,我会说你需要一个Map&lt;String, Product&gt;。要映射它,我建议您使用名称 products 将其放入 Stores(并删除此处没有意义的 productsSet - 集合将映射到 JSON 数组,而您的 JSON 没有该属性的数组)。

标签: java json jackson json-deserialization


【解决方案1】:

主要问题是您的产品是动态的,并且可以是任意数量的产品。因此,您不是在处理集合(Set 或 List),而是更多地处理字典,例如 Map。

这个解决方案可能不是我们想要的(需要一个适配器来适配所需的模型):

class Stores {

    @JsonProperty("id")
    private int id;

    @JsonProperty("products")
    private Products productsSet;
}

@Getter
@Setter
class Products extends LinkedHashMap<String, String[]> {
}

还有测试:

   Store store = mapper.readValue("{\"store\": ....", Store.class);

    assertEquals(1, store.stores.size());

    Products product = store.getStores().stream().map(Stores::getProductsSet).findFirst().orElseThrow();
    product.forEach((name, prices) -> {
        System.out.println(name + ": " + Arrays.toString(prices));
    });

将打印:

prod1: [price, quantity]
prod2: [price, quantity]
prod3: [price, quantity]

================================================ ========================

更好的方法是使用集合来表示产品:

{
  "store": [
    {
      "id": "100",
      "products": [
        {"name": "prod1", "prices": ["price","quantity"]},
        {"name": "prod2", "prices": ["price","quantity"]},
        {"name": "prod3", "prices": ["price","quantity"]}
      ]
    }
  ]
}

这种方法的唯一缺点是可能会出现重复。但这取决于您是否可以更改 JSON 结构。

【讨论】:

    【解决方案2】:

    成功了

    @Data
    @NoArgsConstructor
    public class Stores {
    
        @JsonProperty("id")
        private int id;
    
        @JsonProperty("products")
        private Map<String, T> productsSet;
    }    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 2016-12-27
      • 2019-05-27
      • 1970-01-01
      • 1970-01-01
      • 2017-04-11
      相关资源
      最近更新 更多