前言
上次说了fastjson的简单使用,但是在序列化过程中,我们无法保证我们即将要序列化的属性,但是有时候我们有些特殊的需求,例如如果一个属性是空,那这个属性要不要序列化进去,当然对于不同的业务有不同的需求。FJ提供方法来完成我们的不同需求
SerializerFeature枚举类
上次我们说了JSON.toJSONString(),里面放入obj,它就可以帮我们序列化成json串,但是里面还可以传入一个参数,是SerializerFeature的枚举。例如JSON.toJSONString(stuList, SerializerFeature.PrettyFormat);
应该没人敢把这个串上生产吧….具体就是这么使用,下面列举一下SerializerFeature中用的比较多的成员
// 格式化后的串加入空格换行之类的变得好看(默认压缩节省空间)
JSON.toJSONString(stuList,SerializerFeature.PrettyFormat);
// 格式化后的串key和value使用单引号包裹(默认双引号)
// [{'gender':'男','name':'小明'},{'name':'小刚'}]
JSON.toJSONString(stuList, SerializerFeature.UseSingleQuotes);
// 如果字段为null,依然输出(默认不输出)
// [{"gender":"男","name":"小明"},{"gender":null,"name":"小刚"}]
JSON.toJSONString(stuList, SerializerFeature.WriteMapNullValue);
// 如果list为空, 则序列化成[]而不是null(默认是null)
JSON.toJSONString(stuList,SerializerFeature.WriteNullListAsEmpty);
// 字符类型字段如果为null,输出为”“,而非null
JSON.toJSONString(stuList, SerializerFeature.WriteNullStringAsEmpty);
// 数值字段如果为null,输出为0,而非null
JSON.toJSONString(stuList,SerializerFeature.WriteNullNumberAsZero);
// Boolean字段如果为null,输出为false,而非null
JSON.toJSONString(stuList,SerializerFeature.WriteNullBooleanAsFalse);
// 序列化时写入类型信息,默认没写入。写入后反序列化需要处理,并且额外占用空间
JSON.toJSONString(stuList, SerializerFeature.WriteClassName);
// 格式化后的串加入空格换行之类的变得好看
JSON.toJSONString(stuList, SerializerFeature.SkipTransientField);
实体类上做增强
用枚举方法来增强序列号一般使用map场景的用的多,什么时候使用map,就是不至于创建实体类的时候。当一个业务场景达到要创建实体类的程度了,频繁用这个枚举会很累的。FJ给我们提供了在实体类上一劳永逸做增强的方法。
@Data
@Builder
@JSONType()
private static class Student {
private String name;
private String gender;
}
这个@JSONType注解就可以让这一个类所有属性在序列化的时候做到增强,我也写出一些比较常用的值
@Data
@Builder
// 序列化的时候只包含这些字段
@JSONType(includes = {"name", "gender"})
private static class Student {
private String name;
private String gender;
}
@Data
@Builder
// 序列化的时候忽略这些值
@JSONType(ignores = {"name"})
private static class Student {
private String name;
private String gender;
}
@Data
@Builder
// 会按照输入的字段顺序序列化
@JSONType(orders = {"name", "gender"})
private static class Student {
private String name;
private String gender;
}
@Data
@Builder
// 序列化的时候选择序列化key的命名方式,默认CamelCase s
// CamelCase tudentName
// PascalCase student-name
// SnakeCase student_name
@JSONType(naming = PropertyNamingStrategy.CamelCase)
private static class Student {
private String name;
private String gender;
}
实体类的属性上注解
上面都是控制一些比较宏观的,其实用的比较多的还是在属性字段上的注解-JSONField()
,因为这个可以精确到每一个字段,更加可调控一些,并且其他方式能增强的属性注解也可以做到,我也给出一些比较常用的值
@Data
@Builder
private static class Student {
// 序列化的时候的排序,数字越大排名越强,如果没设置这个值,则字段字母排序
@JSONField(ordinal = 0)
private String name;
private String gender;
}
@Data
@Builder
private static class Student {
private String name;
// 指定序列化以后的名字
@JSONField(name = "sex")
private String gender;
}
@Data
@Builder
private static class Student {
private String name;
private String gender;
// 配置序列化和反序列化时的日期格式
@JSONField(format = "yyyMMdd")
private Date createTime;
}
@Data
@Builder
private static class Student {
// 设置序列化的时候是不是要序列化这个字段,默认是true
@JSONField(serialize=false)
private String name;
// 设置反序列化的时候是不是要这个字段,默认是true
@JSONField(deserialize=false)
private String gender;
}
后言
以上就是FJ的一些序列化增强方法,用的比较多的还是实体类的属性注解,强烈建议大家看一下这个注解的源码,里面有哪些value,每个value的含义马上就能理解,用一下就熟练啦。
(转载本站文章请注明作者和出处 没有气的汽水)
┌┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┬┐ ├ 文章已经完啦, 想要第一时间收到文章更新可以关注↓ ┤ └┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┴┘
Post Directory
下面是评论区,欢迎大家留言探讨或者指出错误哈