Java对象转JSON动态设置字段

需求

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值