解析JSON的這6種方案,真香!

👉 這是一個或許對你有用的社群
🐱 一對一交流/面試小冊/簡歷最佳化/求職解惑,歡迎加入芋道快速開發平臺知識星球。下面是星球提供的部分資料:
👉這是一個或許對你有用的開源專案
國產 Star 破 10w+ 的開源專案,前端包括管理後臺 + 微信小程式,後端支援單體和微服務架構。
功能涵蓋 RBAC 許可權、SaaS 多租戶、資料許可權、商城、支付、工作流、大屏報表、微信公眾號、ERPCRMAI 大模型等等功能:
  • Boot 多模組架構:https://gitee.com/zhijiantianya/ruoyi-vue-pro
  • Cloud 微服務架構:https://gitee.com/zhijiantianya/yudao-cloud
  • 影片教程:https://doc.iocoder.cn
【國內首批】支援 JDK 17/21 + SpringBoot 3.3、JDK 8/11 + Spring Boot 2.7 雙版本 

在 Java 開發中,解析 JSON 是一個非常常見的需求。
不管是和前端互動、呼叫第三方介面,還是處理配置檔案,幾乎都繞不開 JSON。
這篇文章總結了6種主流的 JSON 解析方法,希望對你會有所幫助。

1. 使用 Jackson:業界標配

功能特點

  • 強大的序列化和反序列化 :支援將 JSON 字串轉為 Java 物件,也支援將 Java 物件轉換為 JSON。
  • 支援複雜結構 :處理巢狀物件、陣列、泛型等場景非常輕鬆。
  • 支援註解 :如 @JsonIgnore@JsonProperty 等,能精細控制序列化與反序列化的行為。
  • 效能高 :Jackson 的效能非常出色,是很多企業級專案的首選。

程式碼示例

1. JSON 轉物件(反序列化)
import

 com.fasterxml.jackson.databind.ObjectMapper;

publicclassJacksonExample

{

publicstaticvoidmain(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()); 

// 輸出:張三

    }

}

classUser

{

privateint

 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")

優缺點

優點 缺點
功能全面,支援複雜場景 配置較多,學習成本稍高
效能高,社群活躍,企業級專案首選 過於強大,部分功能用不上
豐富的註解支援,便於控制序列化行為 庫體積較大,對於小型專案略顯笨重
基於 Spring Boot + MyBatis Plus + Vue & Element 實現的後臺管理系統 + 使用者小程式,支援 RBAC 動態許可權、多租戶、資料許可權、工作流、三方登入、支付、簡訊、商城等功能
  • 專案地址:https://github.com/YunaiV/ruoyi-vue-pro
  • 影片教程:https://doc.iocoder.cn/video/

2. 使用 Gson:輕量好用

功能特點

  • 輕量級 :Gson 的設計非常簡潔,程式碼量少,適合中小型專案。
  • 支援泛型 :可以輕鬆解析帶泛型的 JSON。
  • 註解控制 :支援透過註解控制序列化行為,如 @Expose
  • 易擴充套件 :透過自定義序列化器和反序列化器,可以處理複雜的場景。

程式碼示例

1. JSON 轉物件
import

 com.google.gson.Gson;

publicclassGsonExample

{

publicstaticvoidmain(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/

3. 使用 FastJSON:高效能

功能特點

  • 效能優異 :FastJSON 的解析速度非常快,適合大資料量場景。
  • 支援動態欄位 :可以輕鬆處理動態 JSON 資料。
  • 強大的型別支援 :支援巢狀物件、泛型、陣列等複雜結構。
  • 註解控制 :類似 Jackson 和 Gson,支援註解控制欄位的序列化和反序列化。

程式碼示例

1. JSON 轉物件
import

 com.alibaba.fastjson.JSON;

publicclassFastJsonExample

{

publicstaticvoidmain(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;

publicclassJsonPathExample

{

publicstaticvoidmain(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;

publicclassOrgJsonExample

{

publicstaticvoidmain(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;

publicclassManualParsing

{

publicstaticvoidmain(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 或欄位不固定的場景 自由度高,靈活性強 程式碼複雜,效率低於專業工具
工具千千萬,場景最重要!
選對了工具,才能省時省力,少踩坑多摸魚。

歡迎加入我的知識星球,全面提升技術能力。
👉 加入方式,長按”或“掃描”下方二維碼噢
星球的內容包括:專案實戰、面試招聘、原始碼解析、學習路線。
文章有幫助的話,在看,轉發吧。
謝謝支援喲 (*^__^*)

相關文章