@JSONField与@JsonProperty的不同使用场景

前言

已知@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依赖的引用树:
spring-boot-starter-web引用了jackson
可以看到java开发中常见的spring-boot-starter-web依赖,其底层引用了jackson-core这个包,而@JsonProperty注解就是在这个包中的。

使用场景

所以,我们可以说spring boot官方对Json对象的操作是使用了jackson组件。
以下列举两个常见的影响范围:

  1. 控制层方法入参中常用的@RequestBody注解
  2. 控制层直接返回实体对象

@RequestBody

前端使用POST方式向后端传输Json字符串时,我们一般会使用@RequestBody注解修饰对应的控制层方法的入参对象,使得Json字符串中的内容能够映射到一个实体类中,而这个过程就是使用了jackson的@JsonProperty注解。

控制层直接返回实体对象

控制层直接返回实体对象时,并不是调用了对象的toString方法,而是自动调用jackson组件完成对象的Json序列化。

总结

@JSONField与@JsonProperty隶属两个不同的包,前者是阿里系的fastjson包,后者是spring boot官方使用的jackson包。
一般的,在使用spring框架自动生成或解析Json相关的数据时,会调用jackson包,@JsonProperty会生效;在手动引入fastjson组件并进行对应的Json对象(反)序列化时,@JSONField会生效,

猜你喜欢

转载自blog.csdn.net/Ka__ze/article/details/132494233