一眼看清@JSONField注解使用与效果
# @jsonField注解
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER})
public @interface JSONField {
int ordinal() default 0;
String name() default "";
String format() default "";
boolean serialize() default true;
boolean deserialize() default true;
//其他省略
}
2
3
4
5
6
7
8
9
10
11
12
13
14
# @jsonField注解常用属性
name : 给字段起别名
ordinal :用来排序 输出json字符串中key属性的先后顺序 可以用 @JSONType (orders={})来代替
format : 用来日期格式化
serialize :指定字段不序列化
deserialize :指定字段不序列化
@JSONField注解可以用在方法(method),属性(field)以及方法中的参数(parameter)上。JSONField中的name属性用来指定JSON串中key的名称。
通过用@JSONField注解一个类的属性,我们可以达到以下目标:
指定field对应的key名称:@JSONField(name = “Demo”) 对于时间字段,指定其格式:@JSONField(format = “yyyy-MM-dd HH:mm:ss”) 不序列化某些字段:@JSONField(serialize = false) 指定顺序:@JSONField(ordinal = 1) 当然,以上注解里的属性,可以同时使用:@JSONField(name = “Name”, format = “yyyy-MM-dd HH:mm”)
# @JSONField注解常用的使用场景总结
# 修改字段名称
当我们在与前端进行交互时,前端想要的字段与我们提供的字段名不同,这时候一种解决方案是修改实体类,但如果该实体类应用的比较多,那改起来的代价太大,因此,可以使用注解@JSONField
来实现替换效果,用法如下:
@JSONField(name = "size_new")
private int size;
2
3
# 支持序列化和反序列化
序列化和反序列化默认值均为true
,则默认情况下是允许该字段序列化和反序列化的,如下:
boolean serialize() default true;
boolean deserialize() default true;
2
3
使用方法(以下不支持序列化,支持反序列化)
@JSONField(name = "size_new", serialize = false, deserialize = true)
private int size;
2
当我们的某些字段为空值时,我们仍希望将此字段返回到前端(该配置可以返回带有空字段的字符串,但是当字段为基本数据类型时无效,须将其转换为包装类)
@JSONField(serialzeFeatures= SerializerFeature.WriteMapNullValue)
# 指定字段顺序
将Java对象转换为JSON格式,转换后的字段顺序会根据首字母来排序,可通过如下方式来指定字段顺序:
@JSONField(name = "size_new", ordinal = 3)
private int size;
@JSONField(name = "weight_new", ordinal = 1)
private int weight;
@JSONField(name = "colour_new", ordinal = 2)
private String colour;
2
3
4
5
6
7
8
9
# 格式化时间
@JSONField(name = "pay_time", format = "yyyy-MM-dd HH:mm:ss")
Date payTime;
2
3
# 总结
FastJson中的注解@JSONField,一般作用在get/set方法上面,常用的使用场景有修改和json字符串的字段映射的name、格式化时间、过滤掉不需要序列化的字段。