前言
已知@JSONField与@JsonProperty两个注解都是加在bean的属性上,用在对象在转化成Json对象时将对应的字段进行特殊处理。
但是两者的看起来作用似乎相同,所以在使用时有时会出现混淆,本文以几个常用的使用场景为例,尽量说明它们之间的区别。
@JSONField
所属组件
@JSONField 注解来自于如下包:com.alibaba.fastjson.annotation.JSONField
。
可以看出是属于fastjson组件中的类,而fastjson是常见的JSON库,使用频率很高。
使用场景
那么,既然是fastjson库中的注解,所以要在使用fastjson中的组件进行bean转JSON字符串时才会生效,比如:
// JSON是fastjson包中的
JSON.toJSON(event)
@JsonProperty
所属组件
@JSONField 注解来自于如下包:com.fasterxml.jackson.annotation.JsonProperty
。
可以看出是属于jackson组件中的类,但是好像项目中没有主动引用过jackson组件?
查看pom依赖的引用树:
可以看到java开发中常见的spring-boot-starter-web
依赖,其底层引用了jackson-core
这个包,而@JsonProperty注解就是在这个包中的。
使用场景
所以,我们可以说spring boot官方对Json对象的操作是使用了jackson组件。
以下列举两个常见的影响范围:
- 控制层方法入参中常用的@RequestBody注解
- 控制层直接返回实体对象
@RequestBody
前端使用POST方式向后端传输Json字符串时,我们一般会使用@RequestBody注解修饰对应的控制层方法的入参对象,使得Json字符串中的内容能够映射到一个实体类中,而这个过程就是使用了jackson的@JsonProperty注解。
控制层直接返回实体对象
控制层直接返回实体对象时,并不是调用了对象的toString方法,而是自动调用jackson组件完成对象的Json序列化。
总结
@JSONField与@JsonProperty隶属两个不同的包,前者是阿里系的fastjson包,后者是spring boot官方使用的jackson包。
一般的,在使用spring框架自动生成或解析Json相关的数据时,会调用jackson包,@JsonProperty会生效;在手动引入fastjson组件并进行对应的Json对象(反)序列化时,@JSONField会生效,