写点什么

jackson 学习之八:常用方法注解,为什么阿里的程序员成长如此之快

用户头像
极客good
关注
发布于: 刚刚

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. 测试代码和结果如下,可见序列化时 JsonGette


【一线大厂Java面试题解析+核心总结学习笔记+最新架构讲解视频+实战项目源码讲义】
浏览器打开:qq.cn.hn/FTf 免费领取
复制代码


r 的 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(String[] 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 +


'}';


}


}


public static void main(String[] args) throws Exception {


String jsonStr = "{\n" +


" "field0" : "000",\n" +


" "aaa" : "value_aaa",\n" +


" "bbb" : "value_bbb"\n" +


"}";

用户头像

极客good

关注

还未添加个人签名 2021.03.18 加入

还未添加个人简介

评论

发布
暂无评论
jackson学习之八:常用方法注解,为什么阿里的程序员成长如此之快