需求
User类:
@Data
public class User {
private String name;
private Integer age;
}
序列化成JSON时,处理动态增加一个sex字段
{
"name": "张三",
"age": 20,
"sex": "男"
}
方法一
利用@JsonAnyGetter注解进行扩展User的自定义属性
改造User类:
@Data
public class User {
private String name;
private Integer age;
private Map<String, String> otherAttributes = new HashMap<>();
// 利用JsonAnyGetter可以进行序列化时,将不包含在Java类属性中的其他属性添加到JSON字符串中
@JsonAnyGetter
public Map<String, String> getOtherAttributes() {
return this.otherAttributes;
}
// 利用JsonAnySetter可以进行反序列化时,将不包含在Java类属性中的其他属性放到map里面
@JsonAnySetter
public void setOtherAttribute(String key, String value) {
this.otherAttributes.put(key, value);
}
}
使用:
User user = new User();
user.setName("张三");
user.setAge(20);
user.setOtherAttribute("sex", "男");
ObjectMapper objectMapper = new ObjectMapper();
String jsonStr = objectMapper.writeValueAsString(user);
System.out.println(jsonStr);
方法二
利用ObjectNode类动态增加JSON属性:
User user = new User();
user.setName("张三");
user.setAge(20);
ObjectMapper objectMapper = new ObjectMapper();
ObjectNode jsonNodes = objectMapper.valueToTree(user);
jsonNodes.put("sex", "男");
String jsonStr = objectMapper.writeValueAsString(user);
System.out.println(jsonStr);
总结
方法一 需要修改原始DTO类,但是可以增加反序列时获取额外信息的功能
方法二 不需要修改原始DTO类,但是功能仅限于序列化时的动态修改
————————————————