JSON利器之Jackson 序列化与反序列化常用注解解密

概述

Jackson 属于转换json的重要工具,同时由于Spring boot 默认使用Jackson,了解下Jackson 序列化很有必要。

序列化

@JsonAnyGetter

@JsonAnyGetter 把Map中的 每个key都转成一个属性

1.将非静态和无参数方法定义为“any getter"。它充当获取一组键值对的访问器。

2. 返回类型是Map.

3. 启用了一个接受布尔值的元素。当我们将false传递给enabled元素时,注释@JsonAnyGetter对该注释的方法无效.

4. 同一个类上只用一个属性.

5. 会将Map序列化为JSON。 Map的键将是JSON字段的名称,而该键的对应值将是对应的JSON字段的值

代码实例

测试

序列化json 后。

{"attr2":"val2","attr1":"val1"}

关闭 @JsonAnyGetter(enable=false)序列化后

{"properties":{"attr2":"val2","attr1":"val1"}}

@JsonGetter

是@JsonProperty注释的替代方法,用于将方法标记为getter方法。

代码实例

测试

输出结果

{"id":1,"name":"My bean"}

@JsonPropertyOrder

指定序列化属性顺序,作用与类。

实例指定序列化顺序 name,id

测试结果

{"name":"My order","id":1}

JsonPropertyOrder 支持alphabetic(按照字母顺序排序),默认alphabetic=false.

@JsonRawValue

@JsonRawValue可用于按原样序列化属性。该值不转义或引用。这在已经JSON中序列化的值或已引用值的情况下很有用。

可以使用可选的布尔参数值来定义此注释是否处于活动状态

结果

{"name":"My bean","json":{"attr":false}}

@JsonValue

用在字段或方法上(无参,有可序列化的返回值),表明Jackson在序列化该类实例时,只序列化字段的值或方法返回值。 一个类中最多使用一个@JsonValue注解

测试及结果

@JsonRootName

@JsonRootName作用在类上,指定序列化时根包装的名称。需要与SerializationFeature.WRAP_ROOT_VALUE配合使用。

测试及结果

@JsonSerialize

可以作用在类,字段,getter方法,表示自定义序列化。字段和getter方法上面的优先级比在类上的高。

自定义时间格式。

测试及结果

反序列化

@JsonCreator

json反序列化为java对象时,该注解用于定义构造函数。当从json创建java时,@JsonCreator注解的构造函数被会调用,如果没有@JsonCreator注解,则默认调用java类的无参构造函数。

实例

反序列化:

{

"id":1,

"name":"name"

}

测试及结果

@JacksonInject

用于属性,标识注入值而非在json获取值。

实例测试

@JsonAnySetter

可以灵活地使用Map的key作为属性。反序列化时,JSON的属性将被简单地添加到map中

@JsonDeserialize

自定义反序列化。实现StdDeserializer或是其父类JsonSerializer

实例,反序列化时间。

测试及结果

@ JsonAlias

别名。反序列化期间属性的一个或多个其他替代名称

兼容性注解

@JsonIgnoreProperties

作用在类上,用来说明有些属性在序列化/反序列化时需要忽略掉。

可以将它看做是@JsonIgnore的批量操作,但它的功能比@JsonIgnore要强,比如一个类是代理类,我们无法将将@JsonIgnore标记在属性或方法上,此时便可用@JsonIgnoreProperties标注在类 声 明上,它还有一个重要的功能是作用在反序列化时解析字段时过滤一些未知的属性,否则通常情况下解析到我们定义的类不认识的属性便会抛出异常。

可以注明是想要忽略的属性列表如@JsonIgnoreProperties({"name"}),

也可以注明过滤掉未知的属性如@JsonIgnoreProperties(ignoreUnknown=true)

@JsonIgnore

作用在属性或方法上,用来完全忽略被注解的字段和方法对应的属性,即便这个字段或方法可以被自动检测到或者还有其他的注解。

@JsonIgnoreType

作用于类,表示被注解该类型的属性将不会被序列化和反序列化

@JsonInclude

作用与类,序列化排除空值或null及默认值。

JsonAutoDetect

作用在类上,来开启/禁止自动检测

总结

上面是Jackson中序列化与反序列化时注解,自定义注解以后另行整理。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191023A0M6U100?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

同媒体快讯

扫码关注云+社区

领取腾讯云代金券