FastJson序列化部分字段的方法 Maven FastJson FastJson 序列化依据 指定某些字段进行序列化 排除某些字段 关于是否需要添加默认构造函数的问题 参考文献

引入 fastjson 的 Maven 依赖:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>fastjson</artifactId>
    <version>1.2.73</version>
</dependency>

FastJson 序列化依据

FastJson 是根据 getter 方法来序列化的

指定某些字段进行序列化

  • 只为需要序列化的字段生成 getter 方法,相反地,不希望序列化的字段就不生成 getter 方法
    • 缺点:有时候,虽然是不希望序列化的字段,但是代码中也是需要使用其 getter 方法的。
  • 假如Java Bean对象所有属性的 getter 方法都存在,还可以使用过滤器 SimplePropertyPreFilter 指定字段名称。(注意如果没有 getter 方法,过滤器中就算指定名称也不会生效)
    • 缺点:因为使用字符串来指定字段名称,所以如果类的属性名称修改了,这个地方的代码就会失效。
SimplePropertyPreFilter filter = new SimplePropertyPreFilter(User.class, "name");
String data = JSONObject.toJSONString(user, filter);

排除某些字段

假如Java Bean对象所有属性的 getter 方法都存在,我们还有一个思路,就是排除某些字段,不让这些字段参与序列化:

  • 可以通过 @JSONField(serialize = false) 阻止某些字段序列化

关于是否需要添加默认构造函数的问题

我自己测试了一下,假如没有默认构造函数:

  • 1.2.35 版本及以前版本,反序列化时会抛出 com.alibaba.fastjson.JSONException: default constructor not found. class test.fastjson.serialization.User
  • 1.2.36 版本及以后版本,即使没有默认构造函数也不会抛出异常,会去尝试寻找合适的构造函数,具体逻辑,先留个坑,以后再研究一下源码再说。

参考文献