FastJSON 使用注意事项:JSON.toJSONString
与 Null 值处理
FastJSON 是由阿里巴巴开源的一套高性能 JSON 处理器。相较于其他 JSON 处理器(如 Gson、Jackson)以及 Java 原生的序列化/反序列化方式,FastJSON 在性能上通常具有显著优势。
使用 JSON.toJSONString
的注意事项
1. Null 值属性的默认行为(潜在的“坑”)
- 现象: 当使用
JSON.toJSONString
将一个 Java 对象转换为 JSON 字符串时,如果该对象的某些属性值为null
,FastJSON 默认会将这些属性从生成的 JSON 字符串中完全过滤掉(即不包含对应的 key)。 - 示例: 假设一个对象有三个属性
a
,b
,c
,其中a=1
,b="hello"
,c=null
。默认情况下,转换后的 JSON 字符串会是{"a":1,"b":"hello"}
,属性c
及其null
值会被省略。 - 潜在问题: 这种默认行为在某些场景下可能不符合预期(例如,需要明确区分
null
和字段不存在,或者下游系统要求完整的字段结构)。
2. 生成 JSON 字符串的两种主要方式
FastJSON 提供了两种核心方法将对象转换为 JSON 字符串:
JSON.toJSONString(Object object)
- 这是最常用的静态方法。
- 直接作用于目标对象。
JSONObject.toJSONString(Object object)
- 通过
JSONObject
的静态方法实现。 - 功能上与
JSON.toJSONString
基本相同。通常更推荐直接使用JSON.toJSONString
。
- 通过
3. 控制 Null 值输出的序列化特性
FastJSON 提供了特定的 SerializerFeature
来控制 null
值的序列化行为,避免其被默认过滤:
-
SerializerFeature.WriteMapNullValue
- 作用: 强制输出值为
null
的字段。 - 效果: 值为
null
的属性会以key: null
的形式出现在 JSON 字符串中。 - 适用场景: 适用于所有类型的
null
值(对象、数组、字符串、数字等)。 - 用法示例:
Map<String, Object> map = new HashMap<>(); map.put("a", 1); map.put("b", "hello"); map.put("c", null); String jsonString = JSON.toJSONString(map, SerializerFeature.WriteMapNullValue); // 结果: {"a":1,"b":"hello","c":null}
- 作用: 强制输出值为
-
SerializerFeature.WriteNullStringAsEmpty
- 作用: 将值为
null
的字符串 (String
) 字段序列化为空字符串""
。 - 效果: 值为
null
的String
类型属性会输出为key: ""
。 - 适用场景: 仅针对
String
类型。其他类型的null
值(如Integer
,List
等)不会被处理(默认仍可能被过滤,除非同时使用WriteMapNullValue
)。 - 用法示例:
public class Message { private Integer id; private String content; // String 类型 // getters & setters } Message msg = new Message(); msg.setId(1); msg.setContent(null); // content 是 String 且为 null String jsonString = JSON.toJSONString(msg, SerializerFeature.WriteNullStringAsEmpty); // 结果: {"id":1,"content":""} (注意 content 是空字符串)
- 作用: 将值为
关键区别与选择
WriteMapNullValue
: 保留所有null
字段,显式输出为null
。适用于需要明确表示字段存在但值为空的场景。WriteNullStringAsEmpty
: 仅将String
类型的null
转换为空字符串""
。适用于特定要求字符串字段不能为null
而必须是空字符串的场景。它不影响非String
类型的null
值。
注意事项
- 如果需要处理非
String
类型的null
值(如Integer
,Boolean
, 自定义对象等),必须使用WriteMapNullValue
。 - 可以同时传递多个
SerializerFeature
:JSON.toJSONString(obj, SerializerFeature.WriteMapNullValue, SerializerFeature.WriteNullStringAsEmpty, ...);
- 如果同时使用
WriteMapNullValue
和WriteNullStringAsEmpty
:- 对于
String
类型的null
值,会应用WriteNullStringAsEmpty
,输出为""
。 - 对于其他类型的
null
值,会应用WriteMapNullValue
,输出为null
。
- 对于
- 可以通过配置
JSON.DEFAULT_GENERATE_FEATURE
来修改全局默认的序列化特性(包含WriteMapNullValue
),但这会影响所有未显式指定特性的序列化操作,需谨慎使用。
9 条评论
文献引用规范,学术态度严谨,值得借鉴。
https://www.bilibili.com/opus/521971043391297398
https://www.cnblogs.com/bluestorm/p/18405840
https://zhuanlan.zhihu.com/p/9780381446
解决方法是 sudo nano /etc/default/grub 加入一行 GRUB_DISABLE_OS_PROBER="false"
sudo grub-mkconfig -o /boot/grub/grub.cfg
https://nosomber.github.io/2024/05/15/archinstall/
https://www.163.com/dy/article/HTIBB6B90511CPOJ.html
https://www.bilibili.com/video/BV1KM4m1R7Jn/?vd_source=da17cc3cedcac84c9b2856f2cfbd8c86
sudo pacman -S nvidia-driver # 对于NVIDIA显卡
https://yaijlmydbvj.feishu.cn/wiki/YVuJw146WiJQvbkAIuncx6VanZR?fromScene=spaceOverview
https://blog.csdn.net/m0_47670683/article/details/113793200
《谁偷了我的DNA》科幻片高清在线免费观看:https://www.jgz518.com/xingkong/44686.html
揭秘传奇私服制作网站的幕后黑手与非法产业链:https://501h.com/jinbi/2024-10-15/42494.html
看的我热血沸腾啊