Java JSON全解析6種主流方案深度對(duì)比與實(shí)戰(zhàn)指南
一、Jackson:企業(yè)級(jí)項(xiàng)目的“標(biāo)配之選”
Jackson是Java生態(tài)中最主流的JSON解析庫(kù),Spring Boot默認(rèn)集成Jackson作為內(nèi)置解析工具,其強(qiáng)大的功能和優(yōu)異的性能使其成為企業(yè)級(jí)項(xiàng)目的首選。
實(shí)戰(zhàn)代碼
1. 基礎(chǔ)轉(zhuǎn)換(對(duì)象與JSON互轉(zhuǎn))
import com.fasterxml.jackson.databind.ObjectMapper;
// 定義實(shí)體類
class User {
private Integer id;
private String name;
private String email;
// 必須提供無(wú)參構(gòu)造函數(shù)(Jackson反射依賴)
public User() {}
// Getter和Setter省略
}
public class JacksonDemo {
public static void main(String[] args) throws Exception {
ObjectMapper objectMapper = new ObjectMapper();
String jsonStr = "{\"id\":1,\"name\":\"張三\",\"email\":\"zhangsan@example.com\"}";
// JSON轉(zhuǎn)對(duì)象(反序列化)
User user = objectMapper.readValue(jsonStr, User.class);
System.out.println("反序列化結(jié)果:" + user.getName());
// 對(duì)象轉(zhuǎn)JSON(序列化)
User newUser = new User();
newUser.setId(2);
newUser.setName("李四");
newUser.setEmail("lisi@example.com");
String newJsonStr = objectMapper.writeValueAsString(newUser);
System.out.println("序列化結(jié)果:" + newJsonStr);
}
}2. 高級(jí)功能(注解控制)
import com.fasterxml.jackson.annotation.*;
import java.util.Date;
class AdvancedUser {
@JsonProperty("user_id") // JSON字段名映射(解決駝峰與下劃線沖突)
private Integer id;
@JsonIgnore // 序列化時(shí)忽略該字段
private String password;
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss", timezone = "GMT+8") // 日期格式化
private Date createTime;
// Getter和Setter省略
}
// 序列化示例
AdvancedUser user = new AdvancedUser();
user.setId(3);
user.setPassword("123456");
user.setCreateTime(new Date());
String json = new ObjectMapper().writeValueAsString(user);
// 輸出:{"user_id":3,"createTime":"2025-08-01 15:30:00"}適用場(chǎng)景
- 企業(yè)級(jí)應(yīng)用、Spring Boot項(xiàng)目;
- 復(fù)雜對(duì)象轉(zhuǎn)換、需要精細(xì)控制序列化行為的場(chǎng)景;
- 高并發(fā)、大數(shù)據(jù)量的JSON處理場(chǎng)景。
二、Gson:輕量級(jí)項(xiàng)目的“易用之選”
Gson是Google開(kāi)源的JSON解析庫(kù),以簡(jiǎn)潔的API設(shè)計(jì)和極低的學(xué)習(xí)成本著稱,適合中小型項(xiàng)目和快速開(kāi)發(fā)場(chǎng)景。
實(shí)戰(zhàn)代碼
1. 基礎(chǔ)轉(zhuǎn)換
import com.google.gson.Gson;
import java.util.List;
public class GsonDemo {
public static void main(String[] args) {
Gson gson = new Gson();
String jsonStr = "{\"id\":1,\"name\":\"王五\",\"age\":25}";
// JSON轉(zhuǎn)對(duì)象
User user = gson.fromJson(jsonStr, User.class);
System.out.println("反序列化結(jié)果:" + user.getAge());
// 對(duì)象轉(zhuǎn)JSON
String newJsonStr = gson.toJson(user);
System.out.println("序列化結(jié)果:" + newJsonStr);
// 泛型對(duì)象轉(zhuǎn)換(List為例)
String listJson = "[{\"id\":1,\"name\":\"張三\"},{\"id\":2,\"name\":\"李四\"}]";
List<User> userList = gson.fromJson(listJson, new com.google.gson.reflect.TypeToken<List<User>>() {}.getType());
System.out.println("List反序列化大?。? + userList.size());
}
}2. 高級(jí)功能(注解與自定義適配器)
import com.google.gson.annotations.Expose;
import com.google.gson.GsonBuilder;
class GsonUser {
@Expose(serialize = true, deserialize = true) // 序列化和反序列化都生效
private Integer id;
@Expose(serialize = false) // 僅反序列化,不序列化
private String tempField;
// Getter和Setter省略
}
// 自定義適配器(處理日期格式)
class DateAdapter implements com.google.gson.TypeAdapter<Date> {
private SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
@Override
public void write(com.google.gson.stream.JsonWriter out, Date value) throws IOException {
out.value(sdf.format(value));
}
@Override
public Date read(com.google.gson.stream.JsonReader in) throws IOException {
try {
return sdf.parse(in.nextString());
} catch (ParseException e) {
return null;
}
}
}
// 使用示例
Gson gson = new GsonBuilder()
.registerTypeAdapter(Date.class, new DateAdapter()) // 注冊(cè)適配器
.excludeFieldsWithoutExposeAnnotation() // 只序列化帶@Expose注解的字段
.create();適用場(chǎng)景
- 中小型項(xiàng)目、快速開(kāi)發(fā)需求;
- 簡(jiǎn)單JSON轉(zhuǎn)換場(chǎng)景(無(wú)復(fù)雜字段控制需求);
- 對(duì)庫(kù)體積敏感的場(chǎng)景(如移動(dòng)端Java應(yīng)用)。
三、FastJSON:高性能場(chǎng)景的“極速之選”
FastJSON是阿里巴巴開(kāi)源的JSON解析庫(kù),以極致的解析速度聞名,適合大數(shù)據(jù)量、高并發(fā)場(chǎng)景的JSON處理。
實(shí)戰(zhàn)代碼
1. 基礎(chǔ)轉(zhuǎn)換
import com.alibaba.fastjson.JSON;
import java.util.List;
public class FastJsonDemo {
public static void main(String[] args) {
String jsonStr = "{\"id\":1,\"name\":\"趙六\",\"address\":\"北京\"}";
// JSON轉(zhuǎn)對(duì)象
User user = JSON.parseObject(jsonStr, User.class);
System.out.println("反序列化結(jié)果:" + user.getAddress());
// 對(duì)象轉(zhuǎn)JSON
String newJsonStr = JSON.toJSONString(user);
System.out.println("序列化結(jié)果:" + newJsonStr);
// JSON轉(zhuǎn)List
String listJson = "[{\"id\":1,\"name\":\"張三\"},{\"id\":2,\"name\":\"李四\"}]";
List<User> userList = JSON.parseArray(listJson, User.class);
System.out.println("List反序列化大?。? + userList.size());
}
}2. 高級(jí)功能(動(dòng)態(tài)字段與格式化)
import com.alibaba.fastjson.serializer.SerializerFeature;
// 動(dòng)態(tài)字段解析(JSON轉(zhuǎn)Map)
String dynamicJson = "{\"id\":1,\"name\":\"孫七\(yùn)",\"score\":90.5}";
Map<String, Object> map = JSON.parseObject(dynamicJson, Map.class);
System.out.println("動(dòng)態(tài)字段score:" + map.get("score"));
// 格式化輸出(美化JSON)
User user = new User();
user.setId(2);
user.setName("周八");
String prettyJson = JSON.toJSONString(user, SerializerFeature.PrettyFormat);
System.out.println("美化后的JSON:" + prettyJson);
// 日期格式化
JSON.DEFFAULT_DATE_FORMAT = "yyyy-MM-dd HH:mm:ss";
String dateJson = JSON.toJSONString(new Date(), SerializerFeature.WriteDateUseDateFormat);
System.out.println("日期格式化結(jié)果:" + dateJson);適用場(chǎng)景
- 高并發(fā)、大數(shù)據(jù)量的JSON處理(如日志解析、批量數(shù)據(jù)同步);
- 動(dòng)態(tài)字段較多的場(chǎng)景(如第三方接口返回不固定字段);
- 對(duì)解析速度有極致要求的場(chǎng)景。
四、JsonPath:嵌套JSON的“字段提取神器”
JsonPath是一款專注于JSON字段提取的工具,通過(guò)類似XPath的路徑表達(dá)式,可快速?gòu)膹?fù)雜嵌套JSON中提取目標(biāo)字段,無(wú)需完整反序列化為Java對(duì)象。
實(shí)戰(zhàn)代碼
import com.jayway.jsonpath.JsonPath;
import java.util.List;
public class JsonPathDemo {
public static void main(String[] args) {
// 復(fù)雜嵌套JSON
String complexJson = """
{
"store": {
"book": [
{"title": "Java編程思想", "price": 108, "category": "編程"},
{"title": "深入理解Java虛擬機(jī)", "price": 89, "category": "編程"},
{"title": "三體", "price": 39, "category": "科幻"}
],
"address": {
"city": "北京",
"street": "科技園路"
}
}
}
""";
// 1. 提取單個(gè)字段(商店城市)
String city = JsonPath.read(complexJson, "$.store.address.city");
System.out.println("商店城市:" + city);
// 2. 提取數(shù)組所有元素的某個(gè)字段(所有書籍標(biāo)題)
List<String> bookTitles = JsonPath.read(complexJson, "$.store.book[*].title");
System.out.println("所有書籍標(biāo)題:" + bookTitles);
// 3. 條件過(guò)濾(價(jià)格大于80的書籍)
List<Object> expensiveBooks = JsonPath.read(complexJson, "$.store.book[?(@.price > 80)]");
System.out.println("價(jià)格大于80的書籍:" + expensiveBooks);
// 4. 提取數(shù)組指定索引元素(第一本書的價(jià)格)
Double firstBookPrice = JsonPath.read(complexJson, "$.store.book[0].price");
System.out.println("第一本書價(jià)格:" + firstBookPrice);
}
}適用場(chǎng)景
- 僅需提取JSON中部分字段(無(wú)需完整轉(zhuǎn)換);
- 復(fù)雜嵌套JSON的字段查詢(如第三方接口返回的深層嵌套數(shù)據(jù));
- 動(dòng)態(tài)篩選JSON數(shù)組中的元素。
五、org.json:簡(jiǎn)單場(chǎng)景的“輕量工具”
org.json是Java原生風(fēng)格的JSON工具類,無(wú)需復(fù)雜依賴,僅提供基礎(chǔ)的JSON構(gòu)造和字段提取功能,適合簡(jiǎn)單場(chǎng)景的快速開(kāi)發(fā)。
實(shí)戰(zhàn)代碼
import org.json.JSONArray;
import org.json.JSONObject;
public class OrgJsonDemo {
public static void main(String[] args) {
// 1. 解析JSON字符串
String jsonStr = "{\"id\":1,\"name\":\"吳九\",\"hobbies\":[\"籃球\",\"讀書\"]}";
JSONObject jsonObject = new JSONObject(jsonStr);
// 提取字段
String name = jsonObject.getString("name");
JSONArray hobbies = jsonObject.getJSONArray("hobbies");
System.out.println("姓名:" + name + ",愛(ài)好:" + hobbies.get(0));
// 2. 構(gòu)造JSON
JSONObject newJsonObject = new JSONObject();
newJsonObject.put("id", 2);
newJsonObject.put("name", "鄭十");
newJsonObject.put("age", 30);
// 構(gòu)造JSON數(shù)組
JSONArray skills = new JSONArray();
skills.put("Java");
skills.put("MySQL");
newJsonObject.put("skills", skills);
System.out.println("構(gòu)造的JSON:" + newJsonObject.toString());
}
}適用場(chǎng)景
- 簡(jiǎn)單JSON的構(gòu)造或字段提?。ㄈ缗渲梦募x?。?;
- 無(wú)需依賴第三方庫(kù)的場(chǎng)景(如小型工具類、嵌入式應(yīng)用);
- 快速原型開(kāi)發(fā),無(wú)需復(fù)雜JSON處理功能。
六、手動(dòng)解析:特殊場(chǎng)景的“靈活方案”
手動(dòng)解析是指不依賴第三方庫(kù),通過(guò)字符串處理、正則表達(dá)式等方式解析JSON,靈活性最高,但開(kāi)發(fā)成本和維護(hù)成本也最高。
實(shí)戰(zhàn)代碼(簡(jiǎn)單JSON手動(dòng)解析)
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class ManualParseDemo {
public static void main(String[] args) {
String jsonStr = "{\"id\":1,\"name\":\"手動(dòng)解析\",\"value\":\"test\"}";
Map<String, String> resultMap = parseJson(jsonStr);
System.out.println("id:" + resultMap.get("id"));
System.out.println("name:" + resultMap.get("name"));
}
// 簡(jiǎn)單JSON手動(dòng)解析(僅支持字符串和數(shù)字字段)
private static Map<String, String> parseJson(String json) {
Map<String, String> map = new HashMap<>();
// 正則表達(dá)式匹配 "key":"value" 或 "key":number
Pattern pattern = Pattern.compile("\"(.*?)\":\"?(.*?)\"?(,|})");
Matcher matcher = pattern.matcher(json.replaceAll("\\s+", "")); // 去除空格
while (matcher.find()) {
String key = matcher.group(1);
String value = matcher.group(2);
map.put(key, value);
}
return map;
}
}適用場(chǎng)景
- 非標(biāo)準(zhǔn)JSON數(shù)據(jù)(如字段無(wú)引號(hào)、格式不規(guī)則);
- 對(duì)依賴庫(kù)有嚴(yán)格限制的場(chǎng)景;
- 簡(jiǎn)單且固定格式的JSON,無(wú)需引入第三方庫(kù)。
到此這篇關(guān)于Java JSON解析全攻略:6種主流方案深度對(duì)比與實(shí)戰(zhàn)指南的文章就介紹到這了,更多相關(guān)Java JSON解析內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java使用synchronized實(shí)現(xiàn)互斥鎖功能示例
這篇文章主要介紹了Java使用synchronized實(shí)現(xiàn)互斥鎖功能,結(jié)合實(shí)例形式分析了Java使用synchronized互斥鎖功能簡(jiǎn)單實(shí)現(xiàn)方法與操作技巧,需要的朋友可以參考下2020-05-05
spring boot 本地圖片不能加載(圖片路徑)的問(wèn)題及解決方法
這篇文章主要介紹了spring boot 本地圖片不能加載(圖片路徑)的問(wèn)題,解決的辦法其實(shí)很簡(jiǎn)單,只要寫一個(gè)配置文件,也就是圖片位置的轉(zhuǎn)化器,原理是虛擬一個(gè)在服務(wù)器上的文件夾,與本地圖片的位置進(jìn)行匹配。需要的朋友可以參考下2018-04-04
SpringBoot自動(dòng)化配置原理和自定義starter方式
SpringBoot自動(dòng)配置機(jī)制主要通過(guò)-spring-boot-starter和-spring-boot-autoconfigure創(chuàng)建自定義starter模塊,使用EnableAutoConfiguration注解加載自動(dòng)配置類,啟動(dòng)類通過(guò)創(chuàng)建Spring容器完成自動(dòng)化裝配2026-04-04
詳解mybatis-plus實(shí)體類中字段和數(shù)據(jù)庫(kù)中字段名不對(duì)應(yīng)解決辦法
這篇文章主要介紹了詳解mybatis-plus實(shí)體類中字段和數(shù)據(jù)庫(kù)中字段名不對(duì)應(yīng)解決辦法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03
MyBatis實(shí)現(xiàn)分頁(yè)全過(guò)程
MyBatis分頁(yè)有三種方式:手動(dòng)SQL分頁(yè)(性能高但需處理數(shù)據(jù)庫(kù)差異)、RowBounds(簡(jiǎn)單但不推薦)、PageHelper分頁(yè)插件(自動(dòng)改寫SQL,推薦生產(chǎn)環(huán)境),PageHelper適合百萬(wàn)級(jí)數(shù)據(jù)優(yōu)化,是終極解決方案2025-08-08
SpringBoot下載文件遇到文件損壞等問(wèn)題解決方案
調(diào)用接口下載spring?boot工程的resources目錄下的excel模板文件,非常常見(jiàn)的一個(gè)文件下載功能,但是卻容易遇到很多坑,下面總結(jié)記錄下2023-10-10
Java通過(guò)MySQL的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ)
這篇文章主要介紹了如何在Java中MySQL的加解密函數(shù)實(shí)現(xiàn)敏感字段存儲(chǔ),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2022-03-03
SpringSecurity+Redis認(rèn)證過(guò)程小結(jié)
這篇文章主要介紹了SpringSecurity+Redis認(rèn)證過(guò)程小結(jié),本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-01-01
shardingjdbc之配置druid數(shù)據(jù)庫(kù)連接池過(guò)程
這篇文章主要介紹了shardingjdbc之配置druid數(shù)據(jù)庫(kù)連接池過(guò)程,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-03-03
使用Java對(duì)數(shù)據(jù)庫(kù)進(jìn)行基本的查詢和更新操作
這篇文章主要介紹了使用Java對(duì)數(shù)據(jù)庫(kù)進(jìn)行基本的查詢和更新操作,是Java入門學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-10-10

