FastJson 序列化处理 null 值

北风几吹夏 / 2024-10-23 / 原文

FastJson 序列化处理 null 值的

1. 默认行为

  • FastJson 序列化时默认跳过值为 null 的字段。这意味着如果一个对象的某个字段为 null,序列化后的 JSON 不会包含该字段。

2. 序列化 null 字段

  • 如果希望保留 null 值字段,即使字段的值为 null 也要在 JSON 中体现出来,可以使用 SerializerFeature.WriteMapNullValue 配置。这会让所有字段即使是 null 也被序列化。

3. null 字符串输出为空字符串

  • 对于 String 类型的字段,使用 SerializerFeature.WriteNullStringAsEmpty 可以将 null 值序列化为空字符串 ""。示例:

    {
        "field": ""
    }
    

    但要注意,这个配置只对 String 类型的字段有效。

4. null 值转换为其他默认值

  • FastJson 提供了一系列 SerializerFeature 用于处理不同类型的 null 值:
    • WriteNullStringAsEmpty: 将 null 字符串输出为空字符串 ""
    • WriteNullNumberAsZero: 将 null 数字类型字段输出为 0
    • WriteNullListAsEmpty: 将 null 列表类型字段输出为空列表 []
    • WriteNullBooleanAsFalse: 将 null 布尔类型字段输出为 false

5. 示例代码

如果希望将 null 值保留,同时将字符串类型的 null 输出为空字符串,可以在序列化时配置多个 SerializerFeature

return JSON.toJSONString(t, 
    JSONWriter.Feature.WriteClassName,  // 输出类型名
    SerializerFeature.WriteMapNullValue, // 保留 null 值字段
    SerializerFeature.WriteNullStringAsEmpty // 将 null 字符串输出为空字符串
).getBytes(DEFAULT_CHARSET);

6. 注意事项

  • 对于非字符串类型的字段(如 Integer, LocalDateTime),WriteNullStringAsEmpty 不适用。这些字段如果为 null,需要使用其他对应的 SerializerFeature(如 WriteNullNumberAsZero)进行处理。

为什么fastjson字段为null时不输出空字符串?