需求

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类,但是功能仅限于序列化时的动态修改
————————————————