FastJson的JSONField注解
AI-摘要
Tianli GPT
AI初始化中...
介绍自己
生成本文简介
推荐相关文章
前往主页
前往tianli博客
一、前言
今天聊聊fastjson的这个注解@JSONField
首先它可以放到方法上
例如我们pojo的getter和setter等
其次用的最多的是放到属性上
- 例如我这里新建一个POJO
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
private static class Student implements Serializable {
private static final long serialVersionUID = -3289647584974663707L;
private String name;
private Integer age;
private String job;
private GenderEnum gender;
private Date birthday;
private String json;
}
- 这里的性别枚举
@Getter
@AllArgsConstructor
public enum GenderEnum {
FEMALE("女", 0),
MALE("男", 1);
private final String name;
private final Integer code;
}
- 运行测试
public static void main(String[] args) {
Instant from = LocalDateTime.parse("2021-01-09 00:00:00", DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss", Locale.ENGLISH)).toInstant(ZoneOffset.MAX);
Student supa = Student.builder().name("supa").age(20).gender(GenderEnum.MALE).birthday(Date.from(from)).json("{\"word\":\"xxx\"}").build();
String serializeStr = JSON.toJSONString(supa);
System.out.println(serializeStr);
Student student = JSON.parseObject(serializeStr, Student.class);
System.out.println(student);
}
- 运行结果

二、@JSONField的属性
1、ordinal
- ordinal可以指定序列化后的json字符串属性顺序
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
private static class Student implements Serializable {
private static final long serialVersionUID = -3289647584974663707L;
@JSONField(ordinal = 3)
private String name;
@JSONField(ordinal = 1)
private Integer age;
private String job;
@JSONField(ordinal = 2)
private GenderEnum gender;
private Date birthday;
private String json;
}
- 运行结果

2、name
- 它可以指定我们序列化/反序列化属性的名称
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
private static class Student implements Serializable {
private static final long serialVersionUID = -3289647584974663707L;
@JSONField(ordinal = 3,name = "studentName")
private String name;
@JSONField(ordinal = 1)
private Integer age;
private String job;
@JSONField(ordinal = 2)
private GenderEnum gender;
private Date birthday;
private String json;
}
- 运行结果
- 我们可以看到原本的字段名为name的,序列化之后变成了我们指定的studentName

3、format
- 对于日期格式,我们可以使用它去指定日期格式
Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
private static class Student implements Serializable {
private static final long serialVersionUID = -3289647584974663707L;
@JSONField(ordinal = 3, name = "studentName")
private String name;
@JSONField(ordinal = 1)
private Integer age;
private String job;
@JSONField(ordinal = 2)
private GenderEnum gender;
@JSONField(format = "yyyy年MM月dd日E")
private Date birthday;
private String json;
}
- 运行结果

4、serialize
- serialize:默认为true,如果为false,序列化时会忽略该属性
@JSONField(ordinal = 1,serialize=false)
private Integer age;
- 运行结果

5、deserialize
- 然后是deserialize:默认为true,如果为false,反序列化时会忽略该属性
@JSONField(format = "yyyy年MM月dd日E",deserialize = false)
private Date birthday;
- 运行结果

6、serialzeFeatures
- 它的值为com.alibaba.fastjson.serializer.SerializerFeature
- 可以指定一些序列化的选项,例如我们值为null时序列化为空串
@JSONField(serialzeFeatures = {SerializerFeature.WriteNullStringAsEmpty})
private String job;
- 运行结果

7、jsonDirect
- jsonDirect针对值为json字符串的属性,为true则序列化,为false则不序列化,默认为false
@JSONField(jsonDirect = true)
private String json;
- 运行结果

8、serializeUsing
- serializeUsing 可以指定自定义的序列化器
@JSONField(ordinal = 2,serializeUsing = GenderEnumParser.class)
private GenderEnum gender;
- 自定义序列化器
/**
* 性别序列化
*/
public static class GenderEnumParser implements ObjectSerializer {
@Override
public void write(JSONSerializer serializer, Object object, Object fieldName, Type fieldType, int features) throws IOException {
Integer genderCode = null;
if (fieldType.getTypeName().equals(GenderEnum.class.getName())) {
genderCode = ((GenderEnum) object).getCode();
}
serializer.write(genderCode);
}
}
- 运行结果

9、deserializeUsing
- 与serializeUsing相似,可以指定自定义的反序列化器
@JSONField(ordinal = 2,serializeUsing = GenderEnumParser.class, deserializeUsing = GenderEnumFormatter.class)
private GenderEnum gender;
- 自定义反序列化器
public static class GenderEnumFormatter implements ObjectDeserializer {
@Override
public <T> T deserialze(DefaultJSONParser parser, Type type, Object fieldName) {
JSONObject jsonObject = JSON.parseObject(parser.getInput());
Integer genderCode = jsonObject.getInteger(String.valueOf(fieldName));
return (T) Arrays.stream(GenderEnum.values()).filter(gender -> gender.getCode().equals(genderCode)).findFirst().orElse(null);
}
@Override
public int getFastMatchToken() {
return 0;
}
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 leaflei
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果