Java解析JSON的六种方案

 更新时间:2025年01月02日 11:09:14   作者:苏三说技术  
这篇文章介绍了 6 种 JSON 解析方案,包括 Jackson、Gson、FastJSON、JsonPath、、手动解析,分别阐述了它们的功能特点、代码示例、高级功能、优缺点及适用场景,感兴趣的小伙伴跟着小编一起来看看吧

前言

在 Java 开发中,解析 JSON 是一个非常常见的需求。

不管是和前端交互、调用第三方接口,还是处理配置文件,几乎都绕不开 JSON。

这篇文章总结了6种主流的 JSON 解析方法,希望对你会有所帮助。

1. 使用 Jackson:业界标配

功能特点

  • 强大的序列化和反序列化:支持将 JSON 字符串转为 Java 对象,也支持将 Java 对象转换为 JSON。
  • 支持复杂结构:处理嵌套对象、数组、泛型等场景非常轻松。
  • 支持注解:如 @JsonIgnore@JsonProperty 等,能精细控制序列化与反序列化的行为。
  • 性能高:Jackson 的性能非常出色,是很多企业级项目的首选。

代码示例

1. JSON 转对象(反序列化)

import com.fasterxml.jackson.databind.ObjectMapper;

public class JacksonExample {
    public static void main(String[] args) throws Exception {
        String json = "{"id":1,"name":"张三"}";

        ObjectMapper objectMapper = new ObjectMapper();
        User user = objectMapper.readValue(json, User.class);
        System.out.println(user.getName()); // 输出:张三
    }
}

class User {
    private int id;
    private String name;

    // Getters 和 Setters 省略
}

2. 对象转 JSON(序列化)

User user = new User();
user.setId(1);
user.setName("李四");

ObjectMapper objectMapper = new ObjectMapper();
String json = objectMapper.writeValueAsString(user);
System.out.println(json); // 输出:{"id":1,"name":"李四"}

高级功能

  • 日期格式化@JsonFormat(pattern = "yyyy-MM-dd")
  • 忽略字段@JsonIgnore
  • 重命名字段@JsonProperty("custom_name")

优缺点

优点缺点
功能全面,支持复杂场景配置较多,学习成本稍高
性能高,社区活跃,企业级项目首选过于强大,部分功能用不上
丰富的注解支持,便于控制序列化行为库体积较大,对于小型项目略显笨重

2. 使用 Gson:轻量好用

功能特点

  • 轻量级:Gson 的设计非常简洁,代码量少,适合中小型项目。
  • 支持泛型:可以轻松解析带泛型的 JSON。
  • 注解控制:支持通过注解控制序列化行为,如 @Expose
  • 易扩展:通过自定义序列化器和反序列化器,可以处理复杂的场景。

代码示例

1. JSON 转对象

import com.google.gson.Gson;

public class GsonExample {
    public static void main(String[] args) {
        String json = "{"id":1,"name":"王五"}";

        Gson gson = new Gson();
        User user = gson.fromJson(json, User.class);
        System.out.println(user.getName()); // 输出:王五
    }
}

2. 对象转 JSON

User user = new User();
user.setId(2);
user.setName("赵六");

Gson gson = new Gson();
String json = gson.toJson(user);
System.out.println(json); // 输出:{"id":2,"name":"赵六"}

高级功能

忽略字段@Expose

@Expose
private String name;

自定义序列化器/反序列化器

Gson gson = new GsonBuilder()
        .registerTypeAdapter(CustomClass.class, new CustomSerializer())
        .create();

优缺点

优点缺点
轻量级,简单易用,适合中小型项目性能稍逊于 Jackson
学习曲线平滑,新手容易上手功能不如 Jackson 丰富
提供良好的扩展能力复杂对象处理起来较为麻烦

3. 使用 FastJSON:高性能

功能特点

  • 性能优异:FastJSON 的解析速度非常快,适合大数据量场景。
  • 支持动态字段:可以轻松处理动态 JSON 数据。
  • 强大的类型支持:支持嵌套对象、泛型、数组等复杂结构。
  • 注解控制:类似 Jackson 和 Gson,支持注解控制字段的序列化和反序列化。

代码示例

1. JSON 转对象

import com.alibaba.fastjson.JSON;

public class FastJsonExample {
    public static void main(String[] args) {
        String json = "{"id":1,"name":"小明"}";

        User user = JSON.parseObject(json, User.class);
        System.out.println(user.getName()); // 输出:小明
    }
}

2. 对象转 JSON

User user = new User();
user.setId(3);
user.setName("小红");

String json = JSON.toJSONString(user);
System.out.println(json); // 输出:{"id":3,"name":"小红"}

高级功能

自动驼峰转下划线

JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";

动态字段解析

Map<String, Object> map = JSON.parseObject(json, Map.class);

优缺点

优点缺点
性能极高,解析速度快曾有历史安全漏洞的争议
支持复杂的动态字段解析社区活跃度稍逊于 Jackson 和 Gson
功能全面,适合大规模数据处理场景配置选项和 API 比较多,稍显复杂

4. 使用 JsonPath:快速提取嵌套字段

功能特点

  • 高效字段提取:通过路径表达式(类似 XPath)快速提取嵌套字段。
  • 灵活性强:支持动态字段和条件过滤。
  • 轻量级:专注于字段提取,功能简单明确。

代码示例

import com.jayway.jsonpath.JsonPath;

public class JsonPathExample {
    public static void main(String[] args) {
        String json = """
            {
                "store": {
                    "book": [
                        {"title": "书1", "price": 10},
                        {"title": "书2", "price": 20}
                    ]
                }
            }
        """;

        // 提取第一个书籍的标题
        String title = JsonPath.read(json, "$.store.book[0].title");
        System.out.println(title); // 输出:书1

        // 提取所有书籍价格
        List<Integer> prices = JsonPath.read(json, "$.store.book[*].price");
        System.out.println(prices); // 输出:[10, 20]
    }
}

优缺点

优点缺点
字段提取简洁高效不支持序列化和反序列化
动态字段处理能力强依赖 JsonPath 语法
适合快速提取嵌套字段不适合全量 JSON 转换

5. 使用 org.json:轻量工具类

功能特点

  • 轻量级:核心是一个工具类,适合简单场景。
  • 构造和解析简单:适合快速创建 JSON 或提取字段。
  • 灵活性一般:不支持复杂对象映射。

代码示例

import org.json.JSONObject;

public class OrgJsonExample {
    public static void main(String[] args) {
        String json = "{"id":1,"name":"张三"}";

        // 提取字段
        JSONObject jsonObject = new JSONObject(json);
        System.out.println(jsonObject.getString("name")); // 输出:张三

        // 构造 JSON
        JSONObject newJson = new JSONObject();
        newJson.put("id", 2);
        newJson.put("name", "李四");
        System.out.println(newJson.toString()); // 输出:{"id":2,"name":"李四"}
    }
}

优缺点

优点缺点
轻量级,适合简单场景不支持复杂嵌套对象
使用简单,学习成本低功能简单,扩展性差

6. 手动解析 JSON:灵活度最高

功能特点

  • 完全自由:不依赖第三方库,自己解析 JSON。
  • 动态处理:适合不规则字段结构的 JSON。
  • 代码复杂度高:适合特殊场景。

代码示例

import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;

import java.util.Map;

public class ManualParsing {
    public static void main(String[] args) throws Exception {
        String json = "{"id":1,"name":"动态字段"}";

        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {});
        System.out.println(map.get("name")); // 输出:动态字段
    }
}

优缺点

优点缺点
灵活性高,适合动态字段代码复杂度高,不易维护
不依赖第三方库性能和效率低于专业 JSON 库

总结

最后给大家对比一下文章中提到的6种方法各自的优缺点:

方法适用场景优点缺点
Jackson企业级项目,复杂序列化和反序列化场景功能强大,性能优异,支持复杂结构配置复杂,学习曲线高
Gson中小型项目,简单的 JSON 转换场景轻量级,简单易用功能有限,性能略逊
FastJSON高性能需求,大数据量的动态解析性能极高,功能丰富曾有安全漏洞争议,社区支持稍逊 Jackson
JsonPath嵌套结构复杂、动态字段提取场景字段提取语法简单,灵活性强不支持序列化和反序列化
org.json快速解析或构造 JSON 场景轻量级,适合简单场景功能单一,扩展性差
手动解析动态 JSON 或字段不固定的场景自由度高,灵活性强代码复杂,效率低于专业工具

工具千千万,场景最重要!

选对了工具,才能省时省力,少踩坑多摸鱼。

以上就是Java解析JSON的六种方案的详细内容,更多关于Java解析JSON的资料请关注脚本之家其它相关文章!

相关文章

  • 浅谈Java并发 J.U.C之AQS:CLH同步队列

    浅谈Java并发 J.U.C之AQS:CLH同步队列

    AQS内部维护着一个FIFO队列,该队列就是CLH同步队列。下面小编来简单介绍下这个队列
    2019-05-05
  • mapstruct的用法之qualifiedByName示例详解

    mapstruct的用法之qualifiedByName示例详解

    qualifiedByName的意思就是使用这个Mapper接口中的指定的默认方法去处理这个属性的转换,而不是简单的get set,今天通过本文给大家介绍下mapstruct的用法之qualifiedByName示例详解,感兴趣的朋友一起看看吧
    2022-04-04
  • Spring Boot JPA Repository之existsBy查询方法失效的解决

    Spring Boot JPA Repository之existsBy查询方法失效的解决

    这篇文章主要介绍了Spring Boot JPA Repository之existsBy查询方法失效的解决方法,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • Spring如何基于xml实现声明式事务控制

    Spring如何基于xml实现声明式事务控制

    这篇文章主要介绍了Spring如何基于xml实现声明式事务控制,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-10-10
  • JPA如何使用entityManager执行SQL并指定返回类型

    JPA如何使用entityManager执行SQL并指定返回类型

    这篇文章主要介绍了JPA使用entityManager执行SQL并指定返回类型的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06
  • SpringBoot整合阿里云开通短信服务详解

    SpringBoot整合阿里云开通短信服务详解

    这篇文章主要介绍了如何利用SpringBoot整合阿里云实现短信服务的开通,文中的示例代码讲解详细,对我们学习有一定帮助,需要的可以参考一下
    2022-03-03
  • java按竖线分割的实现

    java按竖线分割的实现

    在Java中,我们可以使用split()方法按竖线分割字符串,本文将介绍如何使用Java中的字符串分割方法来按竖线进行分割,同时提供代码示例来帮助读者理解,感兴趣的可以了解一下
    2024-01-01
  • IDEA 设置显示内存的使用情况和内存回收的方法

    IDEA 设置显示内存的使用情况和内存回收的方法

    这篇文章主要介绍了IDEA 设置显示内存的使用情况和内存回收的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-04-04
  • IntelliJ IDEA2019 安装lombok的实现

    IntelliJ IDEA2019 安装lombok的实现

    这篇文章主要介绍了IntelliJ IDEA2019 安装lombok的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-10-10
  • 简单了解java自定义和自然排序

    简单了解java自定义和自然排序

    这篇文章主要介绍了简单了解java自定义和自然排序,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07

最新评论