fastjson 笔记
- demo代码地址
- fastjson 最佳实践
- Maven 下引入 Fastjson
- 序列化一个对象成 JSON 字符串
- 反序列化一个 JSON 字符串成 Java 对象
- 日期格式处理
- 特殊字段配置
- 全局配置
- SerializerFeature 属性使用
- 使用
- 属性解释
- 属性过滤器
- 自定义序列化与反序列化
- 自定义序列化
- 自定义反序列化
- 解决 FastJson 中“$ref 循环引用”的问题
demo代码地址
demo/fastjson at master · suveng/demo · GitHub
fastjson 最佳实践
如果有更好的可以联系作者修正,哈哈哈哈
Maven 下引入 Fastjson
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.32</version>
</dependency>
序列化一个对象成 JSON 字符串
demo.java
/*** 序列化一个对象成JSON字符串* @author suwenguang* @date 2019/11/6*/public String ObjToJsonString(){
Human human = new Human();human.setBody("good");human.setSpirit("上天");human.setBirthday(new Date());human.setAge(22L);ArrayList<Human> famaily = new ArrayList<>();for (int i = 0; i < 5; i++) {
Human member = new Human();member.setBody("good");member.setSpirit("上天");member.setBirthday(new Date());member.setAge(22L);famaily.add(member);}human.setFamaily(famaily);return JSON.toJSONString(human);}
hunman.java
@Data
public class Human {
/*** 身体*/private String body;/*** 精神*/private String spirit;/*** 出生日期*/private Date birthday;/*** 年龄*/private Long age;/*** 家庭*/private List<Human> famaily;
}
结果
{
"age": 22,"birthday": 1573007531738,"body": "good","famaily": [{
"age": 22,"birthday": 1573007531738,"body": "good","spirit": "上天"},{
"age": 22,"birthday": 1573007531738,"body": "good","spirit": "上天"},{
"age": 22,"birthday": 1573007531738,"body": "good","spirit": "上天"},{
"age": 22,"birthday": 1573007531738,"body": "good","spirit": "上天"},{
"age": 22,"birthday": 1573007531738,"body": "good","spirit": "上天"}],"spirit": "上天"
}
反序列化一个 JSON 字符串成 Java 对象
demo.java
使用刚刚的序列化字符串做 反序列化
/*** 反序列化字符串到java对象* @author suwenguang* @date 2019/11/6*/public Human stringToObject(){
String json = "{\n" +" \"age\": 22,\n" +" \"birthday\": 1573007531738,\n" +" \"body\": \"good\",\n" +" \"famaily\": [\n" +" {\n" +" \"age\": 22,\n" +" \"birthday\": 1573007531738,\n" +" \"body\": \"good\",\n" +" \"spirit\": \"上天\"\n" +" },\n" +" {\n" +" \"age\": 22,\n" +" \"birthday\": 1573007531738,\n" +" \"body\": \"good\",\n" +" \"spirit\": \"上天\"\n" +" },\n" +" {\n" +" \"age\": 22,\n" +" \"birthday\": 1573007531738,\n" +" \"body\": \"good\",\n" +" \"spirit\": \"上天\"\n" +" },\n" +" {\n" +" \"age\": 22,\n" +" \"birthday\": 1573007531738,\n" +" \"body\": \"good\",\n" +" \"spirit\": \"上天\"\n" +" },\n" +" {\n" +" \"age\": 22,\n" +" \"birthday\": 1573007531738,\n" +" \"body\": \"good\",\n" +" \"spirit\": \"上天\"\n" +" }\n" +" ],\n" +" \"spirit\": \"上天\"\n" +"}";return JSON.parseObject(json, Human.class);}
结果
日期格式处理
- 特殊字段处理
@JsonField
- 全局处理 FastJsonConfig
特殊字段配置
字段注解配置
/*** 出生日期*/@JSONField(format = "yyyy-MM")private Date birthday;
结果
{
"age": 22,"birthday": "2019-11","body": "good","famaily": [{
"age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },{
"age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },{
"age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },{
"age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" },{
"age": 22, "birthday": "2019-11", "body": "good", "spirit": "上天" }],"spirit": "上天"
}
全局配置
使用 JsonField 配置日期格式,被 FastJsonConfig 的全局配置覆盖掉 · Issue #1868 · alibaba/fastjson · GitHub
SerializerFeature 属性使用
SerializerFeature 属性使用
使用
- 手动使用
- 全局配置
JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat);
属性解释
名称 | 含义 |
---|---|
QuoteFieldNames | 输出 key 时是否使用双引号,默认为 true |
SkipTransientField | 如果是 true,类中的 Get 方法对应的 Field 是 transient,序列化时将会被忽略。默认为 true |
UseSingleQuotes | 使用单引号而不是双引号,默认为 false |
WriteMapNullValue | 是否输出值为 null 的字段,默认为 false |
WriteEnumUsingToString | Enum 输出 name()或者 original,默认为 false |
UseISO8601DateFormat | Date 使用 ISO8601 格式输出,默认为 false |
WriteNullListAsEmpty | List 字段如果为 null,输出为[],而非 null |
WriteNullStringAsEmpty | 字符类型字段如果为 null,输出为”“,而非 null |
WriteNullNumberAsZero | 数值字段如果为 null,输出为 0,而非 null |
WriteNullBooleanAsFalse | Boolean 字段如果为 null,输出为 false,而非 null |
SortField | 按字段名称排序后输出。默认为 false |
WriteTabAsSpecial | 把\t 做转义输出,默认为 false |
PrettyFormat | 结果是否格式化,默认为 false |
WriteClassName | 序列化时写入类型信息,默认为 false。反序列化是需用到 |
DisableCircularReferenceDetect | 消除对同一对象循环引用的问题,默认为 false |
WriteSlashAsSpecial | 对斜杠’/’进行转义 |
BrowserCompatible | 将中文都会序列化为\uXXXX 格式,字节数会多一些,但是能兼容 IE 6,默认为 false |
WriteDateUseDateFormat | 全局修改日期格式,默认为 false。JSON.DEFFAULT_DATE_FORMAT = “yyyy-MM-dd”;JSON.toJSONString(obj, SerializerFeature.WriteDateUseDateFormat); |
DisableCheckSpecialChar | 一个对象的字符串属性中如果有特殊字符如双引号,将会在转成 json 时带有反斜杠转移符。如果不需要转义,可以使用这个属性。默认为 false |
BeanToArray | 将对象转为 array 输出 |
属性过滤器
SerializeFilter 是通过编程扩展的方式定制序列化。Fastjson 支持 6 种 SerializeFilter,用于不同场景的定制序列化。
- PropertyPreFilter:根据 PropertyName 判断是否序列化
- PropertyFilter:根据 PropertyName 和 PropertyValue 来判断是否序列化
- NameFilter:修改 Key,如果需要修改 Key,process 返回值则可
- ValueFilter:修改 Value
- BeforeFilter:序列化时在最前添加内容
- AfterFilter:序列化时在最后添加内容
自定义序列化与反序列化
自定义序列化
- 实现 ObjectSerializer
- 注册 ObjectSerializer
自定义反序列化
- 自定义实现 ObjectDeserializer
- 注册并使用 ObjectDeserializer
JSON 最佳实践 | kimmking’s blog
解决 FastJson 中“$ref 循环引用”的问题
解决 FastJson 中“$ref 循环引用”的问题
解决: 关闭循环依赖检测 DisableCircularReferenceDetect