跳至主要內容

JSONField 注解

Jin大约 2 分钟

JSONField 注解

1、简介

JSONField是作用在FieldMethodParameter上的Annotation,可以用来指定序列化字段的顺序、名字、格式、是否忽略、配置JSONReader/JSONWriterFeatures等。

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_cnopen in new window

    @JSONField(serializeFeatures = Feature.WriteNonStringValueAsString)
    public int id;

输出

"id":"1"
贡献者: Jin