fastJson的JSONField注解

简介: fastJson的JSONField注解

真正的快乐是内在的,它只有在人类的心灵里才能发现。——布雷默

相信关于FastJson大伙都不陌生

今天聊聊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;
}

写一个main函数

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的属性

第一个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;
}

然后再次运行可以看到我们序列化后的JSON串属性顺序按照升序排序了

接下来是name

它可以指定我们序列化/反序列化属性的名称

我们在name上加一个

可以看到之前的name序列化后变成了studentName

下一个是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;
}

序列化后结果就是这样

然后是serialize:默认为true,如果为false,序列化时会忽略该属性

然后是deserialize:默认为true,如果为false,反序列化时会忽略该属性

然后是serialzeFeatures,它的值为com.alibaba.fastjson.serializer.SerializerFeature

可以指定一些序列化的选项,例如我们值为null时序列化为空串

parseFeatures则是可以指定一些转换选项,值为com.alibaba.fastjson.parser.Feature

这两个的值都可以是多个

下面是label,这个跳过

jsonDirect针对值为json字符串的属性,为true则序列化,为false则不序列化,默认为false

然后是serializeUsing

指定序列化时使用哪个序列化器

image-20210314131420096.png

我们自定义一个

/**
 * 性别序列化
 */
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);
    }
}

然后执行

使用deserializeUsing指定反序列化器一样的

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;
    }
}

然后是alternateNames

可以取别名,例如json字符串中,可能叫studentName,也可能叫myName

他们都要反序列化后放入name

我们就可以使用它

相关文章
|
JSON 数据格式
【异常】com.alibaba.fastjson.JSONException: unclosed string : U
【异常】com.alibaba.fastjson.JSONException: unclosed string : U
3671 0
Idea在debug时打上断点没有用 Skipped breakpoint at ... because it happened inside debugger evaluation
Idea在debug时打上断点没有用 Skipped breakpoint at ... because it happened inside debugger evaluation
3709 0
|
JSON fastjson Java
FastJson 完全学习指南(初学者从零入门)
摘要:本文是FastJson的入门学习指南,主要内容包括: JSON基础:介绍JSON格式特点、键值对规则、数组和对象格式,以及嵌套结构的访问方式。FastJson是阿里巴巴开源的高性能JSON解析库,具有速度快、功能全、使用简单等优势,并介绍如何引入依赖,如何替换Springboot默认的JackJson。 核心API: 序列化:将Java对象转换为JSON字符串,演示对象、List和Map的序列化方法; 反序列化:将JSON字符串转回Java对象,展示基本对象转换方法;
3966 77
|
9月前
|
JSON 安全 fastjson
使用阿里巴巴 Fastjson 替代 Spring Boot 默认的 Jackson
本文介绍在 Spring Boot 项目中如何替换默认的 Jackson,集成阿里巴巴 Fastjson 作为 JSON 处理框架。内容涵盖 Fastjson 与 Jackson 的核心对比、依赖配置、自定义消息转换器、null 值统一处理及循环引用控制,并提供安全建议与最佳实践,助你高效、安全地使用 Fastjson。
|
JSON fastjson Java
FastJson使用技巧
FastJson使用技巧
7552 158
|
安全 Java 数据库
ifPresent()`方法的用途、使用场景
ifPresent()`方法的用途、使用场景
1688 4
|
存储 JSON fastjson
聊聊fastjson反序列化的那些坑
聊聊fastjson反序列化的那些坑
4014 0
聊聊fastjson反序列化的那些坑
|
消息中间件 Arthas Java
RocketMQ—一次连接namesvr失败的案例分析
项目组在使用RocketMQ时遇到Consumer连接Name Server失败的问题,异常显示连接特定地址失败。通过Arthas工具逐步分析代码执行路径,定位到创建Channel返回空值导致异常。进一步跟踪发现,问题源于Netty组件在初始化`ByteBufAllocator`时出现错误。分析依赖后确认存在Netty版本冲突。解决方法为排除冲突的Netty包,仅保留兼容版本。
1397 0
RocketMQ—一次连接namesvr失败的案例分析
|
Java 索引
Java开发指南 | 第三十篇】Java 枚举(enum)
Java开发指南 | 第三十篇】Java 枚举(enum)
615 1

热门文章

最新文章