在Spring MVC中将类反序列化为JSON时更改属性名称

我正在尝试使用Spring使用其他API调用,如下所示:

HttpHeaders headers = new HttpHeaders();
headers.add("Authorization", "Basic " + base64Creds);

HttpEntity<String> request = new HttpEntity<String>(headers);
RestTemplate restTemplate = new RestTemplate();

Item item = restTemplate.exchange(url, HttpMethod.GET, request, Item.class).getBody();

我从API获得的响应采用以下形式:

{    
"item":[{
    "itemname": "abc",
    "qty":...
}]
}

Item类包含以下字段:

Class Item{
    @JsonProperty("itemname")
    String name;
    @JsonProperty("qty")
    int quantity;

    // Getter / setter methods
}

我已经在字段中添加了JsonProperty注释,因为它们的名称与我从API获得的json不同.有了这个,我就能成功地反序列化api响应.

但是,当我尝试将Item类再次序列化为json时,字段名称为“itemname”和“qty”.有没有办法将这些保留为“名称”和“数量”,并且能够映射到API响应?

提前致谢.

最佳答案
>如果您只想以不同的形式进行序列化,可以这样做:

public static class Item {

  private String name;
  private int quantity;

  @JsonProperty("name")
  public String getName() {
    return name;
  }

  @JsonProperty("itemname")
  public void setName(String name) {
    this.name = name;
  }

  @JsonProperty("quantity")
  public int getQuantity() {
    return quantity;
  }

  @JsonProperty("qty")
  public void setQuantity(int quantity) {
    this.quantity = quantity;
 }

}

这将读作“{”itemname“:”abc“,”qty“:10}”并写“{”name“:”abc“,”quantity“:10}”.

但是有一个很大的缺点 – 你不能阅读“{”name“:”abc“,”quantity“:10}”,使用这个ObjectMapper(这是更糟糕的解决方案).
>您可以使用2个ObjectMappers而不是类Annotations使用Mixins来配置特定的反序列化

这就是你的Mixin的样子:

abstract public static class ItemMixin {
    ItemMixin(@JsonProperty("itemname") String itemname, @JsonProperty("qty") int qty) { }
    // note: could alternatively annotate fields "w" and "h" as well -- if so, would need to @JsonIgnore getters
    @JsonProperty("itemname") abstract String getName(); // rename property
    @JsonProperty("qty") abstract int getQuantity(); // rename property
}

以下是在ObjectMapper中添加Mixin的方法.

objectMapper.addMixIn(Item.class, ItemMixinA.class);

因此,如果使用Mixin ObjectMapper反序列化,并使用标准ObjectMapper进行序列化,则没有问题.
>您可以为您的类编写自定义JsonDeserialization.

对于具有少量字段的类来说,这很容易,但随着字段数量的增加,复杂性将按比例增长.

转载注明原文:在Spring MVC中将类反序列化为JSON时更改属性名称 - 代码日志