FastJson、JackJson 以及 Gson 的区别

简介: FastJson、JackJson 以及 Gson 是 Java 生态圈中三种常用的 Json 解析器,它们均可将 Java 对象序列化为 Json 格式的字符串,也可将 Json 字符串反序列化为 Java 对象。下面我们讨论一下三者在序列化和反序列化操作中的一些区别。

基本介绍

FastJson、JackJson 以及 Gson 是 Java 生态圈中三种常用的 Json 解析器,它们均可将 Java 对象序列化为 Json 格式的字符串,也可将 Json 字符串反序列化为 Java 对象。下面我们讨论一下三者在序列化和反序列化操作中的一些区别。

Spring Boot 默认使用 JackJson 作为 Json 解析器。

序列化

FastJson 和 JackJson 会根据 getter 方法(如 getXXX)或 is 方法(如 isXXX)获取属性名(XXX),然后调用 getter 方法或 is 方法获取属性值,最终将属性和属性值添加到 Json 字符串中。而 Gson 则是通过遍历实体类中的所有属性并直接获取属性值(未调用 getter 方法)来完成序列化操作。

isXXX 方法生效的前提条件是其返回值的类型为 boolean 或 Boolean。

引入 FashJson 和 Gson 的依赖:

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

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.8.9</version>
</dependency>

创建实体类 User:

public class User {

    private Integer id;

    private String name;

    public void setId(Integer id) {
        this.id = id;
    }

    public void setName(String name) {
        this.name = name;
    }
}

测试:

public class Test {
    public static void main(String[] args) throws JsonProcessingException {
        User user = new User();
        user.setId(1);
        user.setName("John同学");

        // FastJson 序列化
        String json1 = JSONObject.toJSONString(user);
        System.out.println("FastJson 解析结果: " + json1);
        // Gson 序列化
        Gson gson = new Gson();
        String json2 = gson.toJson(user);
        System.out.println("Gson 解析结果: " + json2);
        // JackJson 序列化
        ObjectMapper objectMapper = new ObjectMapper();
        String json3 = objectMapper.writeValueAsString(user);
        System.out.println("JackJson 解析结果: " + json3);
    }
}

测试结果:

FastJson 解析结果: {}
Gson 解析结果: {"id":1,"name":"John同学"}
Exception in thread "main" com.fasterxml.jackson.databind.exc.InvalidDefinitionException: No serializer found for class com.example.test.User and no properties discovered to create BeanSerializer (to avoid exception, disable SerializationFeature.FAIL_ON_EMPTY_BEANS)

在 User 类中,我们并未添加任何的 getter 方法,因此 FastJson 返回了一个 "空串"。由于 Gson 不依赖 getter,所以它可以解析出完整的属性以及属性值。默认情况下,若 JackJson 未获取到任何属性(通过 getter 方法),那么程序将抛出异常。根据提示,我们可以通过关闭 SerializationFeature.FAIL_ON_EMPTY_BEANS 来忽略该异常。

关闭 SerializationFeature.FAIL_ON_EMPTY_BEANS

ObjectMapper objectMapper = new ObjectMapper();
objectMapper.disable(SerializationFeature.FAIL_ON_EMPTY_BEANS);
String json3 = objectMapper.writeValueAsString(user);
System.out.println("JackJson 解析结果: " + json3);

测试结果:

FastJson 解析结果: {}
Gson 解析结果: {"id":1,"name":"John同学"}
JackJson 解析结果: {}

下面我们为 User 类添加 getter 方法和 is 方法,再次测试序列化操作:

public boolean isRemoved() {
    return false;
}

public Integer getId() {
    return id;
}

public String getName() {
    return name;
}

测试结果:

FastJson 解析结果: {"id":1,"name":"John同学","removed":false}
Gson 解析结果: {"id":1,"name":"John同学"}
JackJson 解析结果: {"id":1,"name":"John同学","removed":false}

可见,FashJson 和 JackJson 均解析出了 removed 属性,虽然该属性并未在 User 类中定义,但由于我们添加了 isRemoved 方法且该方法的返回值类型为 boolean,因此 removed 会出现在 Json 串中。反观 Gson,其仅会将 User 类中定义的属性进行序列化。

反序列化

FastJson 和 JackJson 会根据 Json 字符串中的属性,在实体类中查找对应的 setter 方法来为该属性赋值。若未查找到属性对应的 setter 方法,那么 FastJson 会忽略该属性,Jackson 则会抛出异常。相比之下,Gson 会根据 Json 串中的属性以及属性值来填充实体类中对应的属性。

测试:

public class Test {
    public static void main(String[] args) throws JsonProcessingException {
        // FastJson 反序列化
        String json = "{\"id\":1,\"name\":\"John同学\",\"removed\":false}";
        User user1 = JSONObject.parseObject(json, User.class);
        System.out.println("FastJson 解析结果: " + user1);
        // Gson 反序列化
        Gson gson = new Gson();
        User user2 = gson.fromJson(json, User.class);
        System.out.println("Gson 解析结果: " + user2);
        // JackJson 反序列化
        ObjectMapper objectMapper = new ObjectMapper();
        User user3 = objectMapper.readValue(json, User.class);
        System.out.println("JackJson 解析结果: " + user3);
    }
}

测试结果:

FastJson 解析结果: User{id=1, name='John同学'}
Gson 解析结果: User{id=1, name='John同学'}
Exception in thread "main" com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "removed" (class com.example.test.User), not marked as ignorable (2 known properties: "id", "name")

上述代码中,我们在 Json 串中添加了一个 User 类中没有的属性,即 removed。FastJson 和 Gson 均会将该属性忽略,而 JackJson 则抛出了异常,该异常提示 "removed 为不能识别的属性"。当然,我们也可以通过配置 ObjectMapper 来忽略该异常:

// JackJson 反序列化
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
User user3 = objectMapper.readValue(json, User.class);
System.out.println("JackJson 解析结果: " + user3);

测试结果:

FastJson 解析结果: User{id=1, name='John同学'}
Gson 解析结果: User{id=1, name='John同学'}
JackJson 解析结果: User{id=1, name='John同学'}

虽然 FastJson 和 JackJson 在反序列化时均会依赖 setter 方法,但二者之间也存在一些区别。如果我们在实体类中未添加某个属性的 setter 方法,那么 FastJson 将不会为该属性赋值,而 JackJson 则会进一步查找同名的属性,接着完成赋值操作。下面我们注释掉 User 类中的 setName 方法:

//    public void setName(String name) {
//        this.name = name;
//    }

再次测试反序列化操作:

FastJson 解析结果: User{id=1, name='null'}
Gson 解析结果: User{id=1, name='John同学'}
JackJson 解析结果: User{id=1, name='John同学'}
相关文章
|
安全 Java 网络安全
给企业邮箱发送邮件失败
## 一、背景 在项目开发过程中,涉及到一个给企业邮箱发送邮件的功能,但在写完相关的邮件发送代码之后,出现问题,邮件发送失败。其中,邮件发送的相关代码如下: ```java JavaMailSenderImpl javaMailSender = new JavaMailSenderImpl(); javaMailSender.setHost("smtp.aliyun.com"); javaMail
1438 0
|
5月前
|
Web App开发 数据采集 人工智能
做GEO 优化第30天,我被AI认识了吗?真实数据+踩坑复盘
30天实验验证:持续输出+多平台分发,内容被豆包、元宝、文心、千问引用,但仅千问在搜索“二二得四GEO”时准确识别品牌。核心发现:AI知内容,不知“我是谁”。下一步聚焦品牌强绑定(每文3–5次提及)、开放平台同步与月度AI监测。
654 1
|
5月前
|
人工智能 安全 Linux
OpenClaw(Clawdbot) Linux部署全教程:本地搭建、ZeroNews接入及阿里云部署指南
OpenClaw(前身为Clawdbot)凭借“私有化运行+全权限实操”的创新定位,迅速成为AI领域的现象级开源项目。这款被称为“真正能做实事的AI”的工具,打破了传统聊天机器人的功能局限,可在本地设备或服务器上独立运行,通过WhatsApp、Telegram等常用聊天软件接收指令,完成文件读写、邮件管理、系统运维等实操任务,所有数据本地存储,隐私安全性拉满。
694 0
|
机器学习/深度学习 负载均衡 网络架构
Mixture of Experts架构的简要解析
Mixture of Experts(MoE)架构起源于1991年,其核心思想是通过多个专门化的“专家”网络处理输入的不同部分,并由门控网络动态组合输出。这种架构实现了稀疏激活,仅激活部分专家,从而在模型规模与计算成本之间取得平衡。MoE的关键在于门控机制的设计,如线性门控、噪声Top-K门控等,确保模型能根据输入特征自适应选择专家。
1785 8
|
人工智能 API 开发工具
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
GitHub MCP Server是基于Model Context Protocol的服务器工具,提供与GitHub API的无缝集成,支持自动化处理问题、Pull Request和仓库管理等功能。
3798 2
GitHub官方开源MCP服务!GitHub MCP Server:无缝集成GitHub API,实现Git流程完全自动化
|
存储 缓存 应用服务中间件
|
人工智能 分布式计算 大数据
AI Native平台,跨越AI应用从创新到生产的鸿沟
2024年是AI应用的元年,以大模型为中心的 AI Native 应用大爆发正在从理想变成现实。云计算带来的应用创新潮,经历了虚拟机时代和云原生时代,正在全面拥抱以大模型为核心的 AI Native 阶段,推动大数据与AI的工作流前所未有地紧密结合。领先大模型、高效的AI计算平台和统一的大数据平台是 AI Native 应用广泛落地背后不可获缺的要素。 9月20日,2024云栖大会上,阿里云副总裁、阿里云计算平台事业部负责人汪军华宣布大数据AI平台全面升级,为 AI Native 应用大爆发提供坚实的平台支撑。
|
JSON fastjson Java
FastJson使用技巧
FastJson使用技巧
7541 158
|
传感器 缓存 数据可视化
毕设(六)——通过pico用NB模块传输测试
毕设(六)——通过pico用NB模块传输测试
607 0
|
移动开发 前端开发 JavaScript
主流跨平台开发技术对比
【2月更文挑战第1天】
801 3

热门文章

最新文章