解析JSON的这六种方法,真香!

开发 前端
架构在 Java 开发中,解析 JSON 是一个非常常见的需求。不管是和前端交互、调用第三方接口,还是处理配置文件,几乎都绕不开 JSON。这篇文章总结了6种主流的 JSON 解析方法,希望对你会有所帮助。

前言

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

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

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

1. 使用 Jackson:业界标配

功能特点

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

代码示例

  • 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 省略
}
  • 对象转 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。
  • 易扩展:通过自定义序列化器和反序列化器,可以处理复杂的场景。

代码示例

  • 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()); // 输出:王五
    }
}
  • 对象转 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,支持注解控制字段的序列化和反序列化。

代码示例

  • 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()); // 输出:小明
    }
}
  • 对象转 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 或字段不固定的场景

自由度高,灵活性强

代码复杂,效率低于专业工具

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

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

责任编辑:武晓燕 来源: 苏三说技术
相关推荐

2020-05-15 10:09:17

优化创新数字化转型CIO

2020-06-23 09:52:31

运营效率首席信息官IT预算

2020-07-14 08:17:26

代码执行时间

2011-03-04 14:58:40

jqueryJSON

2022-07-13 16:06:16

Python参数代码

2009-06-23 14:23:00

名称空间Java API

2023-12-13 13:41:00

代码Java程序员

2013-10-21 14:26:04

2010-08-26 09:16:42

Web服务器

2023-02-07 06:55:26

Kafka消费消息

2011-06-22 15:21:08

XML

2009-09-02 16:21:02

C#解析Html

2009-03-31 13:12:30

解析XMLJava

2015-11-18 11:56:23

Linux

2015-09-18 11:14:54

2021-03-10 10:13:39

爬虫Python代码

2024-05-16 16:06:59

JSON数据二进制

2021-12-27 14:33:47

Python语言开发

2024-09-18 00:00:10

UUID识别码标志符

2018-08-10 00:03:08

网速网络连接Wi-Fi
点赞
收藏

51CTO技术栈公众号