在 Java 开发中,解析 JSON 是一个非常常见的需求。
不管是和前端交互、调用第三方接口,还是处理配置文件,几乎都绕不开 JSON。
这篇文章总结了6种主流的 JSON 解析方法,希望对你会有所帮助。
-
强大的序列化和反序列化
:支持将 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")
-
-
重命名字段
:
@JsonProperty("custom_name")
优点
|
缺点
|
功能全面,支持复杂场景
|
配置较多,学习成本稍高
|
性能高,社区活跃,企业级项目首选
|
过于强大,部分功能用不上
|
丰富的注解支持,便于控制序列化行为
|
库体积较大,对于小型项目略显笨重
|
基于 Spring Boot + MyBatis Plus + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/ruoyi-vue-pro
-
视频教程:https://doc.iocoder.cn/video/
-
轻量级
:Gson 的设计非常简洁,代码量少,适合中小型项目。
-
-
注解控制
:支持通过注解控制序列化行为,如
@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 丰富
|
提供良好的扩展能力
|
复杂对象处理起来较为麻烦
|
基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能
-
项目地址:https://github.com/YunaiV/yudao-cloud
-
视频教程:https://doc.iocoder.cn/video/
-
性能优异
: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 map = JSON.parseObject(json, Map.class);
优点
|
缺点
|
性能极高,解析速度快
|
曾有历史安全漏洞的争议
|
支持复杂的动态字段解析
|
社区活跃度稍逊于 Jackson 和 Gson
|
功能全面,适合大规模数据处理场景
|
配置选项和 API 比较多,稍显复杂
|
-
高效字段提取
:通过路径表达式(类似 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 prices = JsonPath.read(json, "$.store.book[*].price");
System.out.println(prices); // 输出:[10, 20]
}
}
优点
|
缺点
|
字段提取简洁高效
|
不支持序列化和反序列化
|
动态字段处理能力强
|
依赖 JsonPath 语法
|
适合快速提取嵌套字段
|
不适合全量 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":"李四"}
}
}
优点
|
缺点
|
轻量级,适合简单场景
|
不支持复杂嵌套对象
|
使用简单,学习成本低
|
功能简单,扩展性差
|