当前位置: 代码迷 >> 综合 >> fastjson 笔记
  详细解决方案

fastjson 笔记

热度:90   发布时间:2023-11-30 12:50:19.0

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

结果

日期格式处理

  1. 特殊字段处理 @JsonField
  2. 全局处理 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 属性使用

使用

  1. 手动使用
  2. 全局配置

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:序列化时在最后添加内容

自定义序列化与反序列化

自定义序列化

  1. 实现 ObjectSerializer
  2. 注册 ObjectSerializer

自定义反序列化

  1. 自定义实现 ObjectDeserializer
  2. 注册并使用 ObjectDeserializer

JSON 最佳实践 | kimmking’s blog

解决 FastJson 中“$ref 循环引用”的问题

解决 FastJson 中“$ref 循环引用”的问题

解决: 关闭循环依赖检测 DisableCircularReferenceDetect

  相关解决方案