jackSon中@JsonAnySetter @JsonAnyGetter注解详解

x33g5p2x  于2021-12-25 转载在 其他  
字(1.9k)|赞(0)|评价(0)|浏览(401)

这两个属性是用来在序列化和反序列化的时候多余字段可以通过Map来回转换

@JsonAnyGetter

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里面的值也相当于实体类里面的字段给显示出来了。

@JsonAnySetter

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中拿就好了,省了很多的事情。

相关文章