JSONField 注解
大约 2 分钟
JSONField 注解
1、简介
JSONField
是作用在Field
、Method
、Parameter
上的Annotation
,可以用来指定序列化字段的顺序、名字、格式、是否忽略、配置JSONReader
/JSONWriter
的Features
等。
2、案例
示例:
@Data
@AllArgsConstructor
public class JSONFieldEntity {
//将非String类型的值输出为String,不包括对象和数据类型
@JSONField(serializeFeatures = JSONWriter.Feature.WriteNonStringValueAsString)
public int id;
// 配置字段的序列化输出的的顺序 和 名称
@JSONField(ordinal = 2, name = "jinAge")
private Integer age;
@JSONField(ordinal = 1, name = "jinName")
private String name;
// 忽略序列化,JavaBean 转 JSON 时忽略该属性
@JSONField(ordinal = 3, serialize = false)
private String password;
// 忽略反序列化,JSON 转 JavaBean 时忽略该属性
@JSONField(ordinal = 4, deserialize = false)
private String token;
@JSONField(ordinal = 5, format = "yyyy-MM-dd")
private Date date;
@JSONField(ordinal = 6, format = "yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTime;
@JSONField(ordinal = 7, format = "yyyy-MM-dd")
private LocalDate localDate;
}
测试
@Test
public void fieldTest() {
// 示例的JSON字符串
String json = """
{
"id": 1
"jinName": "Jin",
"jinAge": 18,
"password": "123456",
"token": "123456789",
"date": "2024-07-03",
"localDateTime": "2024-07-03 18:39:03",
"localDate": "2024-07-03"
}
""";
// 使用FastJSON2将JSON字符串解析为 JSONFieldEntity
JSONFieldEntity jsonFieldEntity = JSON.parseObject(json, JSONFieldEntity.class);
// 输出解析后的对象
System.out.println(jsonFieldEntity);
// 在序列化为JSON字符串
System.out.println(JSON.toJSONString(jsonFieldEntity));
}
输出
JSONFieldEntity(id=1, age=18, name=Jin, password=123456, token=123456789, date=Wed Jul 03 00:00:00 CST 2024, localDateTime=2024-07-03T18:39:03, localDate=2024-07-03)
{"id":"1","jinName":"Jin","jinAge":18,"token":"123456789","date":"2024-07-03","localDateTime":"2024-07-03 18:39:03","localDate":"2024-07-03"}
3、分析
3.1、自定义键名
自定义 JSON 输出中的字段名,可以使用 name
属性
@JSONField(name = "jinName")
private String name;
此时,序列化和反序列化的 json
字符串的 name
将变为 jinName
3.2、设置日期格式
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private Date date;
@JSONField(format="yyyy-MM-dd HH:mm:ss")
private LocalDateTime localDateTime;
@JSONField(format="yyyy-MM-dd")
private LocalDate localDate;
注意反序列化为 Date 类型,JSON 日期或时间的长度必须和格式化保持一致。
例如:
- 格式化:
yyyy-MM-dd HH:mm:ss
,参数:2024-07-03 18:39:03
- 格式化:
yyyy-MM-dd
,参数:2024-07-03
3.3、忽略序列化
- 在序列化时忽略某个字段,可以使用
serialize = false
: - JavaBean 转 JSON 时忽略该属性
// 忽略序列化,JavaBean 转 JSON 时忽略该属性
@JSONField(serialize = false)
private String password;
3.4、忽略反序列化
- 反序列化时忽略某个字段,可以使用
deserialize = false
: - JSON 转 JavaBean 时忽略该属性
@JSONField(deserialize = false)
private String token;
3.5、配置字段的序列化输出的的顺序
通过JSONField.ordinal
来配置序列化输出的顺序
@JSONField(ordinal = 2, name = "jinName")
private String name;
@JSONField(ordinal = 1, name = "jinAge")
private Integer age;
3.6、配置序列化 Features
参考:https://github.com/alibaba/fastjson2/wiki/Features_cn
@JSONField(serializeFeatures = Feature.WriteNonStringValueAsString)
public int id;
输出
"id":"1"