Java解析JSON的六大工具介紹與對(duì)比
前言
在 Java 開(kāi)發(fā)中,解析 JSON 是一個(gè)非常常見(jiàn)的需求。
不管是和前端交互、調(diào)用第三方接口,還是處理配置文件,幾乎都繞不開(kāi) JSON。
這篇文章總結(jié)了6種主流的 JSON 解析方法,希望對(duì)你會(huì)有所幫助。
1. 使用 Jackson:業(yè)界標(biāo)配
功能特點(diǎn)
- 強(qiáng)大的序列化和反序列化:支持將 JSON 字符串轉(zhuǎn)為 Java 對(duì)象,也支持將 Java 對(duì)象轉(zhuǎn)換為 JSON。
- 支持復(fù)雜結(jié)構(gòu):處理嵌套對(duì)象、數(shù)組、泛型等場(chǎng)景非常輕松。
- 支持注解:如 @JsonIgnore、@JsonProperty 等,能精細(xì)控制序列化與反序列化的行為。
- 性能高:Jackson 的性能非常出色,是很多企業(yè)級(jí)項(xiàng)目的首選。
代碼示例
1. JSON 轉(zhuǎn)對(duì)象(反序列化)
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. 對(duì)象轉(zhuǎn) 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":"李四"}
高級(jí)功能
- 日期格式化:
@JsonFormat(pattern = "yyyy-MM-dd")
- 忽略字段:
@JsonIgnore
- 重命名字段:
@JsonProperty("custom_name")
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) | 缺點(diǎn) |
功能全面,支持復(fù)雜場(chǎng)景 | 配置較多,學(xué)習(xí)成本稍高 |
性能高,社區(qū)活躍,企業(yè)級(jí)項(xiàng)目首選 | 過(guò)于強(qiáng)大,部分功能用不上 |
豐富的注解支持,便于控制序列化行為 | 庫(kù)體積較大,對(duì)于小型項(xiàng)目略顯笨重 |
2. 使用 Gson:輕量好用
功能特點(diǎn)
- 輕量級(jí):Gson 的設(shè)計(jì)非常簡(jiǎn)潔,代碼量少,適合中小型項(xiàng)目。
- 支持泛型:可以輕松解析帶泛型的 JSON。
- 注解控制:支持通過(guò)注解控制序列化行為,如 @Expose。
- 易擴(kuò)展:通過(guò)自定義序列化器和反序列化器,可以處理復(fù)雜的場(chǎng)景。
代碼示例
1. JSON 轉(zhuǎn)對(duì)象
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. 對(duì)象轉(zhuǎn) 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":"趙六"}
高級(jí)功能
忽略字段:@Expose
@Expose private String name;
自定義序列化器/反序列化器:
Gson gson = new GsonBuilder() .registerTypeAdapter(CustomClass.class, new CustomSerializer()) .create();
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) | 缺點(diǎn) |
輕量級(jí),簡(jiǎn)單易用,適合中小型項(xiàng)目 | 性能稍遜于 Jackson |
學(xué)習(xí)曲線平滑,新手容易上手 | 功能不如 Jackson 豐富 |
提供良好的擴(kuò)展能力 | 復(fù)雜對(duì)象處理起來(lái)較為麻煩 |
3. 使用 FastJSON:高性能
功能特點(diǎn)
- 性能優(yōu)異:FastJSON 的解析速度非??欤m合大數(shù)據(jù)量場(chǎng)景。
- 支持動(dòng)態(tài)字段:可以輕松處理動(dòng)態(tài) JSON 數(shù)據(jù)。
- 強(qiáng)大的類型支持:支持嵌套對(duì)象、泛型、數(shù)組等復(fù)雜結(jié)構(gòu)。
- 注解控制:類似 Jackson 和 Gson,支持注解控制字段的序列化和反序列化。
代碼示例
1. JSON 轉(zhuǎn)對(duì)象
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. 對(duì)象轉(zhuǎn) JSON
User user = new User(); user.setId(3); user.setName("小紅"); String json = JSON.toJSONString(user); System.out.println(json); // 輸出:{"id":3,"name":"小紅"}
高級(jí)功能
自動(dòng)駝峰轉(zhuǎn)下劃線:
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
動(dòng)態(tài)字段解析:
Map<String, Object> map = JSON.parseObject(json, Map.class);
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) | 缺點(diǎn) |
性能極高,解析速度快 | 曾有歷史安全漏洞的爭(zhēng)議 |
支持復(fù)雜的動(dòng)態(tài)字段解析 | 社區(qū)活躍度稍遜于 Jackson 和 Gson |
功能全面,適合大規(guī)模數(shù)據(jù)處理場(chǎng)景 | 配置選項(xiàng)和 API 比較多,稍顯復(fù)雜 |
4. 使用 JsonPath:快速提取嵌套字段
功能特點(diǎn)
- 高效字段提?。和ㄟ^(guò)路徑表達(dá)式(類似 XPath)快速提取嵌套字段。
- 靈活性強(qiáng):支持動(dòng)態(tài)字段和條件過(guò)濾。
- 輕量級(jí):專注于字段提取,功能簡(jiǎn)單明確。
代碼示例
import com.jayway.jsonpath.JsonPath; public class JsonPathExample { public static void main(String[] args) { String json = """ { "store": { "book": [ {"title": "書(shū)1", "price": 10}, {"title": "書(shū)2", "price": 20} ] } } """; // 提取第一個(gè)書(shū)籍的標(biāo)題 String title = JsonPath.read(json, "$.store.book[0].title"); System.out.println(title); // 輸出:書(shū)1 // 提取所有書(shū)籍價(jià)格 List<Integer> prices = JsonPath.read(json, "$.store.book[*].price"); System.out.println(prices); // 輸出:[10, 20] } }
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) | 缺點(diǎn) |
字段提取簡(jiǎn)潔高效 | 不支持序列化和反序列化 |
動(dòng)態(tài)字段處理能力強(qiáng) | 依賴 JsonPath 語(yǔ)法 |
適合快速提取嵌套字段 | 不適合全量 JSON 轉(zhuǎn)換 |
5. 使用 org.json:輕量工具類
功能特點(diǎn)
- 輕量級(jí):核心是一個(gè)工具類,適合簡(jiǎn)單場(chǎng)景。
- 構(gòu)造和解析簡(jiǎn)單:適合快速創(chuàng)建 JSON 或提取字段。
- 靈活性一般:不支持復(fù)雜對(duì)象映射。
代碼示例
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")); // 輸出:張三 // 構(gòu)造 JSON JSONObject newJson = new JSONObject(); newJson.put("id", 2); newJson.put("name", "李四"); System.out.println(newJson.toString()); // 輸出:{"id":2,"name":"李四"} } }
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) | 缺點(diǎn) |
輕量級(jí),適合簡(jiǎn)單場(chǎng)景 | 不支持復(fù)雜嵌套對(duì)象 |
使用簡(jiǎn)單,學(xué)習(xí)成本低 | 功能簡(jiǎn)單,擴(kuò)展性差 |
6. 手動(dòng)解析 JSON:靈活度最高
功能特點(diǎn)
- 完全自由:不依賴第三方庫(kù),自己解析 JSON。
- 動(dòng)態(tài)處理:適合不規(guī)則字段結(jié)構(gòu)的 JSON。
- 代碼復(fù)雜度高:適合特殊場(chǎng)景。
代碼示例
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\":\"動(dòng)態(tài)字段\"}"; ObjectMapper objectMapper = new ObjectMapper(); Map<String, Object> map = objectMapper.readValue(json, new TypeReference<Map<String, Object>>() {}); System.out.println(map.get("name")); // 輸出:動(dòng)態(tài)字段 } }
優(yōu)缺點(diǎn)
優(yōu)點(diǎn) | 缺點(diǎn) |
靈活性高,適合動(dòng)態(tài)字段 | 代碼復(fù)雜度高,不易維護(hù) |
不依賴第三方庫(kù) | 性能和效率低于專業(yè) JSON 庫(kù) |
總結(jié)
最后給大家對(duì)比一下文章中提到的6種方法各自的優(yōu)缺點(diǎn):
方法 | 適用場(chǎng)景 | 優(yōu)點(diǎn) | 缺點(diǎn) |
Jackson | 企業(yè)級(jí)項(xiàng)目,復(fù)雜序列化和反序列化場(chǎng)景 | 功能強(qiáng)大,性能優(yōu)異,支持復(fù)雜結(jié)構(gòu) | 配置復(fù)雜,學(xué)習(xí)曲線高 |
Gson | 中小型項(xiàng)目,簡(jiǎn)單的 JSON 轉(zhuǎn)換場(chǎng)景 | 輕量級(jí),簡(jiǎn)單易用 | 功能有限,性能略遜 |
FastJSON | 高性能需求,大數(shù)據(jù)量的動(dòng)態(tài)解析 | 性能極高,功能豐富 | 曾有安全漏洞爭(zhēng)議,社區(qū)支持稍遜 Jackson |
JsonPath | 嵌套結(jié)構(gòu)復(fù)雜、動(dòng)態(tài)字段提取場(chǎng)景 | 字段提取語(yǔ)法簡(jiǎn)單,靈活性強(qiáng) | 不支持序列化和反序列化 |
org.json | 快速解析或構(gòu)造 JSON 場(chǎng)景 | 輕量級(jí),適合簡(jiǎn)單場(chǎng)景 | 功能單一,擴(kuò)展性差 |
手動(dòng)解析 | 動(dòng)態(tài) JSON 或字段不固定的場(chǎng)景 | 自由度高,靈活性強(qiáng) | 代碼復(fù)雜,效率低于專業(yè)工具 |
到此這篇關(guān)于Java解析JSON的六大工具介紹與對(duì)比的文章就介紹到這了,更多相關(guān)Java解析JSON內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot如何設(shè)置請(qǐng)求參數(shù)長(zhǎng)度和文件大小限制
這篇文章主要介紹了springboot如何設(shè)置請(qǐng)求參數(shù)長(zhǎng)度和文件大小限制,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-09-09Java實(shí)現(xiàn)synchronized鎖同步機(jī)制
synchronized是java內(nèi)置的同步鎖實(shí)現(xiàn),本文就詳細(xì)的介紹一下Java實(shí)現(xiàn)synchronized鎖同步機(jī)制,具有一定的參考價(jià)值,感興趣的可以了解一下2021-11-11Spring?MVC如何實(shí)現(xiàn)接口Controller定義控制器
這篇文章主要介紹了Spring?MVC如何實(shí)現(xiàn)接口Controller定義控制器,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02IDEA解決@Slf4j中l(wèi)og報(bào)紅問(wèn)題
在IntelliJ IDEA中使用log.info()時(shí),如果出現(xiàn)錯(cuò)誤,通常是因?yàn)槿鄙貺ombok插件,以下是解決方法:打開(kāi)IntelliJ IDEA,進(jìn)入設(shè)置(File > Settings 或者 Ctrl+Alt+S),在Plugins部分點(diǎn)擊Browse repositories,搜索Lombok并安裝,安裝完成后,問(wèn)題通??梢越鉀Q2024-12-12SpringBoot?@Transactional事務(wù)不生效排查方式
這篇文章主要介紹了SpringBoot?@Transactional事務(wù)不生效排查方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-01-01