前言

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

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

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

(我最近开源了一个基于 SpringBoot+Vue+uniapp 的商城项目,欢迎访问和star。)[https://gitee.com/dvsusan/susan_mall]

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 或字段不固定的场景 自由度高,灵活性强 代码复杂,效率低于专业工具

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

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

最后说一句(求关注,别白嫖我)

如果这篇文章对您有所帮助,或者有所启发的话,帮忙关注一下我的同名公众号:苏三说技术,您的支持是我坚持写作最大的动力。

求一键三连:点赞、转发、在看。

关注公众号:【苏三说技术】,在公众号中回复:进大厂,可以免费获取我最近整理的10万字的面试宝典,好多小伙伴靠这个宝典拿到了多家大厂的offer。

JSON解析的这6种方案,真香!的更多相关文章

  1. JSON解析方案

    在iOS中,JSON的常见解析方案有4种 第三方框架:JSONKit,SBJson,TouchJSON(性能从左到右,越差) 苹果原生(自带):NSJSONSerialization(性能最好) JS ...

  2. 安卓项目eclipse有用教程:设置应用名字和图标、屏幕、签名、真机调试、clean、logcat、json解析

    怎样在安卓项目中.设置游戏的应用名字和图标? 我们在Androidproject的res资源目录下.会看到3个drawable的目录和一个values目录.就是在这里改动即可.   关于改动应用程序名 ...

  3. django学习-16.返回给前端页面数据为json数据类型的3种方案

    目录结构 1.前言 2.JsonResponse类的源码简单分析 2.1.JsonResponse类的源码如下所示 2.2.JsonResponse类的构造函数里的每个入参的大概含义和作用 3.[方案 ...

  4. IOS中Json解析的四种方法

    作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验 ...

  5. Ajax的三种实现及JSON解析

    本文为学习笔记,属新手文章,欢迎指教!! 本文主要是比较三种实现Ajax的方式,为以后的学习开个头. 准备: 1.  prototype.js 2.  jquery1.3.2.min.js 3.  j ...

  6. JSON解析的几种方式

    在开发中,网络请求和json解析使用的频率是一样高的,因为网络请求返回来的一般都是json(当然还有xml),这里讨论的是json,网络请求的工具类前面我的博客已经写过了,这里给出网址:http:// ...

  7. 几种Java的JSON解析库速度对比

    java中哪个JSON库的解析速度是最快的? JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考 了.我们很少会去 ...

  8. 来自阿里的 json 解析方案 fastjson

    说起Json 解析,有非常多方法,不管是出自Google 的Gson也好,还是来自其它的某某.想必大家都非常熟悉. 今日在github上闲逛.偶遇 一 json 解析库.看起来非常不错,据说是眼下最快 ...

  9. JSON 解析的两种方法

    今天帮朋友看了下JSON解析结果············· eval解析JSON中的注意点 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. ...

  10. 浅谈Android项目----JSON解析(4种解析技术详解)

    json简介 1.概念:json全称是javaScript object Notation,是一种并轻量级的数据交换格式. 2.特点: 1.本质就是具有特定格式的字符串 2.json完全独立于编程语言 ...

随机推荐

  1. Nuxt.js 应用中的 build:before 事件钩子详解

    title: Nuxt.js 应用中的 build:before 事件钩子详解 date: 2024/10/20 updated: 2024/10/20 author: cmdragon excerp ...

  2. iceoryx源码阅读(五)——共享内存通信(三)

    目录 1 正常的消息接收流程 1.1 SubscriberImpl::take 1.2 BaseSubscriber<port_t>::takeChunk 1.3 SubscriberPo ...

  3. 关于在有动态的Scroll Bar情况下页面内容的对齐问题

    关于在有动态的Scroll Bar情况下页面内容的对齐问题 问题场景 一个标题行 + 一些内容行 要求在内容行超过指定行数时 将多出的行隐藏,并展示Scroll Bar的来提示用户可以下划查看更多内容 ...

  4. LeetCode题目练习记录 _数组和链表03 _20211011

    LeetCode题目练习记录 _数组和链表03 _20211011 206. 反转链表 难度简单2015收藏分享切换为英文接收动态反馈 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表 ...

  5. 关于 IntelliJ IDEA 2024 安装使用 (附加激活码、补丁,亲测有效)

    第一步:下载 IDEA 安装包 访问 IDEA 官网,下载 IDEA 2024.1.4 版本的安装包,下载链接如下 : idea官方链接 也可以在这里点击下载idea https://pan.quar ...

  6. 关于C++当中的“模板函数”

    本人C++草鸟,在工作当中遇到了这个问题,就简单做个记录.

  7. 模态内重叠优化,简单有效的CLIP微调方法 | BMVC'24 Oral

    来源:晓飞的算法工程笔记 公众号,转载请注明出处 论文: CLIP Adaptation by Intra-modal Overlap Reduction 论文地址:https://arxiv.org ...

  8. 【更新日志】AI运动识别插件又双叕发布更新了,v1.5.4版已正式发布。

    Ai运动识别插件可以为您的小程序赋于原生的人体检测.运动识别.姿态识别.运动计时计数AI能力,让您的小程序轻松实现AI健身.线上运动会.学生体测等场景,并拥有大量的用户案例,针对近期开发者的反馈,我们 ...

  9. JAXP(Java API for XML Parsing)

    JAXP(Java API for XML Parsing)    过去几年中,XML分折已经被标准为两个不同的处理模型:SAX(Simple API for XML)以及DOM(Document O ...

  10. @EnableAutoConfiguration 标签使用

    @EnableAutoConfiguration 这个注解的作用是: 从classpath中搜索所有META-INF/spring.factories配置文件然后,将其中org.springframe ...