JSON解析的这6种方案,真香!
前言
在 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种方案,真香!的更多相关文章
- JSON解析方案
在iOS中,JSON的常见解析方案有4种 第三方框架:JSONKit,SBJson,TouchJSON(性能从左到右,越差) 苹果原生(自带):NSJSONSerialization(性能最好) JS ...
- 安卓项目eclipse有用教程:设置应用名字和图标、屏幕、签名、真机调试、clean、logcat、json解析
怎样在安卓项目中.设置游戏的应用名字和图标? 我们在Androidproject的res资源目录下.会看到3个drawable的目录和一个values目录.就是在这里改动即可. 关于改动应用程序名 ...
- django学习-16.返回给前端页面数据为json数据类型的3种方案
目录结构 1.前言 2.JsonResponse类的源码简单分析 2.1.JsonResponse类的源码如下所示 2.2.JsonResponse类的构造函数里的每个入参的大概含义和作用 3.[方案 ...
- IOS中Json解析的四种方法
作为一种轻量级的数据交换格式,json正在逐步取代xml,成为网络数据的通用格式. 有的json代码格式比较混乱,可以使用此“http://www.bejson.com/”网站来进行JSON格式化校验 ...
- Ajax的三种实现及JSON解析
本文为学习笔记,属新手文章,欢迎指教!! 本文主要是比较三种实现Ajax的方式,为以后的学习开个头. 准备: 1. prototype.js 2. jquery1.3.2.min.js 3. j ...
- JSON解析的几种方式
在开发中,网络请求和json解析使用的频率是一样高的,因为网络请求返回来的一般都是json(当然还有xml),这里讨论的是json,网络请求的工具类前面我的博客已经写过了,这里给出网址:http:// ...
- 几种Java的JSON解析库速度对比
java中哪个JSON库的解析速度是最快的? JSON已经成为当前服务器与WEB应用之间数据传输的公认标准,不过正如许多我们所习以为常的事情一样,你会觉得这是理所当然的便不再深入思考 了.我们很少会去 ...
- 来自阿里的 json 解析方案 fastjson
说起Json 解析,有非常多方法,不管是出自Google 的Gson也好,还是来自其它的某某.想必大家都非常熟悉. 今日在github上闲逛.偶遇 一 json 解析库.看起来非常不错,据说是眼下最快 ...
- JSON 解析的两种方法
今天帮朋友看了下JSON解析结果············· eval解析JSON中的注意点 在JS中将JSON的字符串解析成JSON数据格式,一般有两种方式: 1.一种为使用eval()函数. 2. ...
- 浅谈Android项目----JSON解析(4种解析技术详解)
json简介 1.概念:json全称是javaScript object Notation,是一种并轻量级的数据交换格式. 2.特点: 1.本质就是具有特定格式的字符串 2.json完全独立于编程语言 ...
随机推荐
- three.js+vue智慧社区web3d数字孪生三维地图
案例效果截图如下: 具体案例场景和功能,详见b站视频: https://www.bilibili.com/video/BV1Bb421E7WL/?vd_source=7d4ec9c9275b9c7d1 ...
- 技术前沿:AI大模型在自动化测试中的应用实例
哈喽,大家好,我是六哥!今天咱们来聊一聊如何用AI大模型(比如GPT-3.5)来做自动化测试,别看这东西听起来高大上,但也没那么神,跟着我咱们一步一步来,保证你也能轻松搞定,学会了保准让你在工作中老省 ...
- Verilog代码规范
历史修改信息 版本 更改描述 更改人 批准人 修订日期/生效日期 A01 发布首版 ldy 一.目的 作为我司verilog开发过程中的输入文件,用于统一FPGA开发人员的代码风格.从而在满足功能和性 ...
- XSS跨站脚本之portswigger labs练习
目录 1 什么是XSS 2 XSS的类型有哪些 3 XSS攻击的过程和原理 4 XSS的防御 5 可能会用到的XSS Payload资源 6 靶场训练 portswigger labs 6.1 没有任 ...
- mysql - 修改字段名称 & 修改字段数据类型
修改字段名称: ALTER TABLE <表名> CHANGE <旧字段名> <新字段名> <新数据类型>: mysql> ALTER TABLE ...
- Clickhouse之数据删除方式
什么是TTL? TTL的意思是Time To Live表示数据的存活时间.由于数据的价值会根据保存的时间成反比,出于存储成本的考虑通常只会保留近一年的数据.而在MergeTree (合并树)引擎中,可 ...
- 【实战问题】-- 并发的时候分布式锁setnx细节
前面讲解到实战问题]-- 设计礼品领取的架构设计以及多次领取现象解决?,如果出现网络延迟的情况下,多个请求阻塞,那么恶意攻击就可以全部请求领取接口成功,而针对这种做法,我们使用setnx来解决,确保只 ...
- Linux禁止某个sudo用户修改root密码
(1) 假设被禁止的sudo用户名为 user (2) 禁止user用户使用passwd命令更改密码(非最终配置) vim /etc/sudoers 加入 user ALL=(root)!/usr/b ...
- uni-app 使用笔记
1.前言 也不知道是我水平菜还是文档太烂,这个框架使用的过程中踩了无数的坑,屡次想砸键盘,最后贫穷让我平复了心情.为了纪念这段操蛋的日子,我决定把这些坑都记录下来. 2.数据请求 在实际的项目中,数据 ...
- 一款 IDEA 必备的 JSON 处理工具插件 — Json Assistant
Json Assistant 是基于 IntelliJ IDEs 的 JSON 工具插件,让 JSON 处理变得更轻松! 主要功能 完全支持 JSON5 JSON 窗口(多选项卡) 选项卡更名 移动至 ...