java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > SpringBoot处理JSON

SpringBoot中处理JSON的三大库应用全指南

作者:zk_xyb

在 Spring Boot 开发中,JSON 作为数据交互的通用格式,其处理效率与准确性直接影响系统性能与用户体验,本文将全面对比SpringBoot处理JSON三大库的特性,希望对大家有所帮助

在 Spring Boot 开发中,JSON 作为数据交互的通用格式,其处理效率与准确性直接影响系统性能与用户体验。目前主流的 JSON 处理库——FastJSON、Jackson 和 Gson,各自具备独特优势,而 null 值的处理更是日常开发中绕不开的核心问题(既要能按需保留关键 null 字段,也要能灵活忽略冗余 null 数据)。本文将全面对比三大库的特性,并系统讲解 null 值的双向处理策略,助你在实际开发中做出最优选择。

一、三大 JSON 库核心特性与基础使用

1. FastJSON:高性能的阿里系工具

核心优势

性能表现

在百万级数据量测试中,FastJSON 的序列化速度通常比 Jackson 快 10%-20%,反序列化速度优势更明显,适合高并发、大数据量的业务场景(如电商订单同步、日志批量处理)。

基础使用示例

// 对象转 JSON
User user = new User("Eve", 29, null);
String json = JSON.toJSONString(user);

// JSON 转对象
User userFromJson = JSON.parseObject(json, User.class);

2. Jackson:Spring 生态的默认之选

核心优势

性能表现

性能略逊于 FastJSON,但稳定性与兼容性更佳,在绝大多数业务场景(如普通接口 交互)中性能足够用。

基础使用示例

ObjectMapper objectMapper = new ObjectMapper();
User user = new User("Frank", 31, null);

// 对象转 JSON
String json = objectMapper.writeValueAsString(user);

// JSON 转对象
User userFromJson = objectMapper.readValue(json, User.class);

3. Gson:轻量易用的 Google 工具

核心优势

性能表现

在大数据量场景下性能较弱,但对于中小型项目(如管理后台、简单接口)完全够用。

基础使用示例

Gson gson = new Gson();
User user = new User("Grace", 27, null);

// 对象转 JSON
String json = gson.toJson(user);

// JSON 转对象
User userFromJson = gson.fromJson(json, User.class);

二、null 值处理全方案:保留与忽略的双向控制

在实际开发中,null 值处理需根据场景灵活切换:有时需保留 null(如接口契约要求字段必须存在),有时需忽略 null(如减少数据传输量)。以下是三大库的双向处理方案:

1. FastJSON 的 null 值双向控制

(1)保留 null 值字段

FastJSON 默认忽略 null,需通过 SerializerFeature.WriteMapNullValue 显式开启保留:

// 局部保留:仅当前转换生效
String jsonWithNull = JSON.toJSONString(user, SerializerFeature.WriteMapNullValue);
// 输出:{"address":null,"age":29,"name":"Eve"}

// 全局保留:所有转换默认保留 null
JSON.DEFAULT_GENERATE_FEATURE |= SerializerFeature.WriteMapNullValue.getMask();
String globalJson = JSON.toJSONString(user); // 同样保留 null 字段

(2)忽略 null 值字段

若全局已开启保留 null,可通过 SerializerFeature.IgnoreNullValue 局部忽略:

// 局部忽略:覆盖全局配置,仅当前转换忽略 null
String jsonWithoutNull = JSON.toJSONString(user, SerializerFeature.IgnoreNullValue);
// 输出:{"age":29,"name":"Eve"}

2. Jackson 的 null 值双向控制

(1)保留 null 值字段

Jackson 通过 JsonInclude.Include.ALWAYS 配置保留 null,支持全局与局部粒度:

// 全局保留:所有类默认保留 null
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.setSerializationInclusion(JsonInclude.Include.ALWAYS);

// 局部保留:仅当前类保留 null(注解优先级更高)
@JsonInclude(JsonInclude.Include.ALWAYS)
public class User {
    private String name;
    private Integer age;
    private String address; // null 时仍会序列化
}

// 输出结果:{"name":"Frank","age":31,"address":null}

(2)忽略 null 值字段

通过 JsonInclude.Include.NON_NULL 忽略 null,同样支持全局与局部:

// 全局忽略:所有类默认忽略 null
objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);

// 局部忽略:仅当前类忽略 null
@JsonInclude(JsonInclude.Include.NON_NULL)
public class User { ... }

// 输出结果:{"name":"Frank","age":31}(address 为 null 时被忽略)

3. Gson 的 null 值双向控制

(1)保留 null 值字段

Gson 默认保留所有 null 值,无需额外配置:

Gson gson = new Gson();
String json = gson.toJson(user); // user.address 为 null 时,输出 {"address":null,...}

(2)忽略 null 值字段

Gson 需通过自定义过滤器实现忽略 null,步骤稍复杂:

Gson gson = new GsonBuilder()
    .setExclusionStrategies(new ExclusionStrategy() {
        @Override
        public boolean shouldSkipField(FieldAttributes f) {
            // 忽略所有 null 字段
            try {
                return f.get(null) == null;
            } catch (Exception e) {
                return false;
            }
        }
        @Override
        public boolean shouldSkipClass(Class<?> clazz) {
            return false;
        }
    })
    .create();

// 输出结果:{"name":"Grace","age":27}(address 为 null 时被忽略)

三、null 值处理场景与最佳实践

1. 必须保留 null 的场景

API 契约严格的场景:如第三方接口要求必须包含所有字段(即使为 null),否则返回错误。

数据一致性要求高的场景:如数据备份/恢复,需确保反序列化后对象与原对象结构完全一致。

前端需要区分“未提交”和“空值”的场景:例如表单中,“未填写”可能对应字段缺失,“填写空值”对应字段为 null。

2. 建议忽略 null 的场景

普通接口 交互:减少无效字段传输,降低带宽消耗,提高响应速度。

前端对 null 不敏感的场景:如列表展示,null 与“无数据”效果一致,可忽略以简化前端逻辑。

缓存场景:减少缓存数据体积,提高缓存命中率与读写效率。

3. 跨库兼容注意事项

若项目中混用多种 JSON 库,需统一 null 处理策略(如全局保留或全局忽略),避免数据格式混乱。

对接第三方服务时,需提前确认其对 null 字段的处理规则(如是否允许 null 或是否要求必须存在)。

四、选型建议与总结

维度FastJSONJacksonGson
性能最优(大数据量优势明显)优秀(满足绝大多数场景)一般(小型项目够用)
null 处理灵活性中(依赖全局/局部配置)高(注解+全局配置,粒度精细)低(忽略 null 需自定义)
生态兼容性需额外引入依赖,与 Spring 集成略逊与 Spring 无缝衔接(默认集成)需额外引入,兼容性良好
学习成本中(注解较多)低(API 简洁)

选型建议

无论选择哪种库,核心是根据业务场景制定统一的 null 处理策略,在数据准确性、传输效率与开发效率之间找到平衡。掌握三大库的 null 处理技巧,能让你在 JSON 转换场景中更游刃有余,提升系统的健壮性与可维护性。

到此这篇关于SpringBoot中处理JSON的三大库应用全指南的文章就介绍到这了,更多相关SpringBoot处理JSON内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文