这两个属性是用来在序列化和反序列化的时候多余字段可以通过Map来回转换
1.方法是非静态,没有参数的,方法名随意
2.方法返回值必须是Map类型
3.在一个实体类中仅仅用在一个方法上
4.序列化的时候json字段的key就是返回Map的key,value就是Map的value
public class User {
private String username;
private String password;
private Integer age;
private Map<String,String> map = new HashMap<>();
@JsonAnyGetter
public Map<String,String> testGet() {
return map;
}
}
测试方法如下
public static void main(String[] args) throws IOException {
User user = new User();
user.setUsername("wkw");
user.setPassword("123");
Map<String, String> map = user.testGet();
map.put("test1","testOne");
map.put("test2","testTwo");
ObjectMapper objectMapper = new ObjectMapper();
String value = objectMapper.writeValueAsString(user);
System.out.println(value);
}
结果如下
{"username":"wkw","password":"123","age":null,"test2":"testTwo","test1":"testOne"}
可以看出加上这个注解以后序列化的时候就会将Map里面的值也相当于实体类里面的字段给显示出来了。
1.用在非静态方法上,注解的方法必须有两个参数,第一个是json字段中的key,第二个是value,方法名随意
2.也可以用在Map对象属性上面,建议用在Map对象属性上面,简单呀
3.反序列化的时候将对应不上的字段全部放到Map里面
public class User {
private String username;
private String password;
private Integer age;
@JsonSetter //方法和属性上只需要一个就可以
private Map<String,String> map = new HashMap<>();
/* @JsonSetter public void testGet(String key, String value) { map.put(key,value); }*/
}
测试方法,自己重写toString
public static void main(String[] args) throws IOException {
String jsonStr = "{\"username\":\"wkw\",\"password\":\"123\"," +
"\"age\":null,\"test2\":\"testTwo\",\"test1\":\"testOne\"}";
ObjectMapper objectMapper = new ObjectMapper();
User user = objectMapper.readValue(jsonStr, User.class);
System.out.println(user);
}
结果:
User{username='wkw', password='123', age=null, map={test2=testTwo, test1=testOne}}
这样子当我们用一个Bean去接收参数的时候,就不用怕不同的接口参数不同,而去写好几个不同的Bean了,只需要一个Bean然后里面存放共有的属性和一个Map就行了,需要的字段直接从Map中拿就好了,省了很多的事情。
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/weixin_44130081/article/details/89674150
内容来源于网络,如有侵权,请联系作者删除!