dru*_*ist 4 spring resttemplate
我正在尝试使用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();
Run Code Online (Sandbox Code Playgroud)
我从API获得的响应采用以下形式:
{
"item":[{
"itemname": "abc",
"qty":...
}]
}
Run Code Online (Sandbox Code Playgroud)
Item类包含以下字段:
Class Item{
@JsonProperty("itemname")
String name;
@JsonProperty("qty")
int quantity;
// Getter / setter methods
}
Run Code Online (Sandbox Code Playgroud)
我已经在字段中添加了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;
}
Run Code Online (Sandbox Code Playgroud)
}
这会"{"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
}
Run Code Online (Sandbox Code Playgroud)
以下是在ObjectMapper中添加Mixin的方法.
objectMapper.addMixIn(Item.class, ItemMixinA.class);
Run Code Online (Sandbox Code Playgroud)
因此,如果使用Mixin ObjectMapper反序列化,并使用标准ObjectMapper进行序列化,则没有问题.
您可以JsonDeserialization为您的班级编写自定义.
对于具有少量字段的类来说,这很容易,但随着字段数量的增加,复杂性会按比例增长.
| 归档时间: |
|
| 查看次数: |
15971 次 |
| 最近记录: |