写点什么

jackson 学习之八:常用方法注解,复习指南

用户头像
Java高工P7
关注
发布于: 2 小时前

JsonValue

  1. 在序列化时起作用,可以用来注解 get 方法或者成员变量;

  2. 一个类中,JsonValue 只允许出现一次;

  3. 如果注解的是 get 方法,那么该方法的返回值就是整个实例的序列化结果;

  4. 如果注解的是成员变量,那么该成员变量的值就是整个实例的序列化结果;

  5. 下面是用来测试的 Pojo 类,JsonValue 注解放在 getField0 方法上,此方法的返回值已经写死了"abc":


static class Test {


private String field0;


private String field1;


@JsonValue


public String getField0() { return "abc"; }


public void setField0(String field0) { this.field0 = field0; }


public String getField1() { return field1; }


public void setField1(String field1) { this.field1 = field1; }


}


  1. Test 类的序列化结果如下,即 getField0 方法的返回值:


JsonCreator

  1. 在反序列化时,当出现有参构造方法时(可能是多个有参构造方法),需要通过 JsonCreator 注解指定反序列化时用哪个构造方法,并且在入参处还要通过 JsonProperty 指定字段关系:


static class Test {


private String field0;


private String field1;


public Test(String field0) {


this.field0 = field0;


}


// 通过 JsonCreator 指定反序列化的时候使用这个构造方法


// 通过 JsonProperty 指定字段关系


@JsonCreator


public Test(@JsonProperty("field0") String field0,


@JsonProperty("field1") String field1) {


this.field0 = field0;


this.field1 = field1;


}


@Override


public String toString() {


return "Test{" +


"field0='" + field0 + ''' +


", field1='" + field1 + ''' +


'}';


}


}


  1. 反序列化结果如下:


JsonSetter

  1. JsonSetter 注解在 set 方法上,被用来在反序列化时指定 set 方法对应 json 的哪个属性;

  2. JsonSetter 源码中,推荐使用 JsonProperty 来取代 JsonSetter:



  1. 测试代码和结果如下,可见反序列化时,是按照 JsonSetter 的 value 去 json 中查找属性的:


JsonGetter

  1. JsonGetter 只能作为方法注解;

  2. 在序列化时,被 JsonGetter 注解的 get 方法,对应的 json 字段名是 JsonGetter 的 value;

  3. JsonGetter 源码中,推荐使用 JsonProperty 来取代 JsonGetter:



  1. 测试代码和结果如下,可见序列化时 JsonGetter 的 value 会被作为 json 字段名:


JsonAnyGetter

  1. JsonAnyGetter 的作用有些特别:在序列化时,用 Map 对象的键值对转成 json 的字段和值;

  2. 理解 JsonAnyGetter 最好的办法,是对比使用前后序列化结果的变化,先来看以下这段代码,是没有 JsonAnyGetter 注解的,Test 有两个成员变量,其中 map 字段是 HashMap 类型的:


package com.bolingcavalry.jacksondemo.annotation.methodannotation;


import com.fasterxml.jackson.annotation.JsonAnyGetter;


import com.fasterxml.jackson.databind.ObjectMapper;


import com.fasterxml.jackson.databind.SerializationFeature;


import java.util.HashMap;


import java.util.Map;


public class JsonAnySetterSerialization {


static class Test {


private String field0;


private Map<String, Object> map;


public String getField0() { return field0; }


public void setField0(String field0) { this.field0 = field0; }


public void setMap(Map<String, Object> map) { this.map = map; }


public Map<String, Object> getMap() { return map; }


}


public static void main(St


《Android学习笔记总结+最新移动架构视频+大厂安卓面试真题+项目实战源码讲义》
浏览器打开:qq.cn.hn/FTe 免费领取
复制代码


ring[] args) throws Exception {


ObjectMapper mapper = new ObjectMapper();


// 美化输出


mapper.enable(SerializationFeature.INDENT_OUTPUT);


// 新增一个 HashMap,里面放入两个元素


Map<String, Object> map = new HashMap<>();


map.put("aaa", "value_aaa");


map.put("bbb", "value_bbb");


Test test = new Test();


test.setField0("000");


// map 赋值给 test.map


test.setMap(map);


System.out.println(mapper.writeValueAsString(test));


}


}


  1. 上述代码的执行结果如下,其实很好理解,就是 field0 和 map 两个字段而已:


{


"field0" : "000",


"map" : {


"aaa" : "value_aaa",


"bbb" : "value_bbb"


}


}


  1. 接下来,对上述代码做一处改动,如下图红框所示,给 getMap 方法增加 JsonAnyGetter 注解:



  1. 修改后的执行结果如下,原来的 map 字段没有了,map 内部的所有键值对都成了 json 的字段:


{


"field0" : "000",


"aaa" : "value_aaa",


"bbb" : "value_bbb"


}


  1. 至此,可以品味出 JsonAnyGetter 的作用了:序列化时,将 Map 中的键值对全部作为 JSON 的字段输出;

JsonAnySetter

  1. 弄懂了前面的 JsonAnyGetter,对于 JsonAnySetter 的作用想必您也能大致猜到:反序列化时,对 json 中不认识的字段,统统调用 JsonAnySetter 注解修饰的方法去处理;

  2. 测试的代码如下,Test 类的 setValue 方法被 JsonAnySetter 注解,在反序列化时,json 中的 aaa 和 bbb 字段,都会交给 setValue 方法处理,也就是放入 map 中:


package com.bolingcavalry.jacksondemo.annotation.methodannotation;


import com.fasterxml.jackson.annotation.JsonAnySetter;


import com.fasterxml.jackson.annotation.JsonCreator;


import com.fasterxml.jackson.annotation.JsonProperty;


import com.fasterxml.jackson.databind.ObjectMapper;


import java.util.HashMap;


import java.util.Map;


public class JsonAnySetterDeserialization {


static class Test {


private String field0;


private Map<String, Object> map = new HashMap<>();


@JsonAnySetter


public void setValue(String key, Object value) {


map.put(key, value);


}


@Override


public String toString() {


return "Test{" +


"field0='" + field0 + ''' +


", map=" + map +


'}';

用户头像

Java高工P7

关注

还未添加个人签名 2021.11.08 加入

还未添加个人简介

评论

发布
暂无评论
jackson学习之八:常用方法注解,复习指南