栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

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

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

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 map;

public String getField0() { return field0; }

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

public void setMap(Map map) { this.map = map; }

public Map getMap() { return map; }

}

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

ObjectMapper mapper = new ObjectMapper();

// 美化输出

mapper.enable(SerializationFeature.INDENT_OUTPUT);

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

Map 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 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" +

“}”;

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/362249.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号