高效處理 JSON 數據:JsonUtil 工具類全方位解析與實戰

在現代軟件開發中,JSON(JavaScript Object Notation)已成為數據交換的“通用語言”——從前后端接口通信到微服務數據交互,從配置文件解析到日志格式化,幾乎所有場景都離不開JSON的處理。然而,原生JSON框架(如FastJSON、Jackson)的API往往需要大量重復代碼,且空指針、格式異常等問題頻發。

本文分享的JsonUtil工具類,基于FastJSON、Jackson等主流框架封裝,整合了18+高頻功能,從基礎的格式轉換到復雜的JSON合并,從安全的字段提取到批量內容替換,全方位覆蓋開發需求。下文將從核心能力、源碼解析、實戰場景、優勢對比等維度展開,幫助開發者徹底掌握JSON高效處理技巧。

一、JsonUtil核心能力全景:從基礎到復雜場景

JsonUtil的設計遵循“業務驅動”原則——所有方法均源自實際開發中的高頻需求。其核心能力可分為六大類,覆蓋JSON處理的全生命周期:

1. JSON合并:多源數據整合的終極方案

在微服務架構中,一個業務數據往往需要從多個接口獲取(如商品詳情需合并基礎信息、庫存、評價等接口數據);在前端開發中,組件數據可能來自多個數據源。JsonUtil的合并能力正是為解決這類問題設計,支持JSONObjectJSONArray兩種合并場景。

  • JSONObject合并(jsonMerge:以目標JSON為基礎,用源JSON的字段覆蓋或遞歸合并(支持嵌套結構)。
  • JSONArray合并(jsonArrayMerge:將兩個數組元素合并為新數組,支持嵌套JSON的深拷貝。

2. 格式轉換:對象與JSON的無縫銜接

對象與JSON的轉換是日常開發中最頻繁的操作之一。JsonUtil封裝了多種轉換邏輯,支持“對象→JSON字符串”“JSON字符串→對象”“集合→JSONArray”等全場景。

  • 基礎轉換fromJsonStringToT(JSON字符串→對象)、objectToJson(對象→JSONObject)。
  • 集合轉換jsonToList(JSON→List)、listToJsonArray(List→JSONArray)。
  • Map轉換jsonToMap(JSON→Map)、jsonToList(JSON→List)。

3. 安全提取:從JSON中獲取字段的“防坑”實踐

直接從JSON中提取字段時,若字段不存在或類型不匹配,極易拋出NullPointerException或類型轉換異常。JsonUtil的提取方法通過“默認值兜底”機制,徹底解決這類問題。

  • 基礎類型提取getString(默認空串)、getInt(默認0)、getBoolean(默認false)。
  • 復雜類型提取getJsonObject(默認null)、getJsonArray(默認null)。

4. 校驗與修改:JSON格式校驗與內容批量處理

在接收外部數據(如用戶輸入、第三方接口返回)時,需先校驗JSON格式合法性;在日志處理、數據清洗場景中,需批量修改JSON中的特定內容。JsonUtil提供了完整的校驗與修改能力。

  • 格式校驗isJsonStr(FastJSON校驗)、isGsonStr(Gson校驗)。
  • 內容修改replaceStringInJson(遞歸替換JSON中的字符串)。

5. 自定義轉換:按需過濾字段的輕量方案

有時需要將對象轉換為JSON,但僅保留部分字段(如接口返回時隱藏敏感字段)。JsonUtil的自定義轉換方法通過反射實現字段過濾,無需手動構建Map。

  • listToStringIncludeArrays(List對象→僅含指定字段的JSON)。
  • objectToStringIncludeArrays(單個對象→僅含指定字段的JSON)。

6. 深拷貝:避免引用傳遞的“獨立副本”生成

JSON對象默認是引用傳遞,修改拷貝對象可能影響原對象。JsonUtil的合并、轉換方法中內置深拷貝邏輯,通過序列化實現對象的完全獨立。

二、核心方法深度解析:從源碼到原理

1. JSON合并(jsonMerge):遞歸邏輯與邊界處理

業務場景:電商商品詳情頁需要合并“基礎信息接口”(含名稱、價格)和“庫存接口”(含庫存數量、倉庫位置)的返回數據,且需保留雙方的非重復字段。

方法作用:用source(源JSON)的字段覆蓋target(目標JSON)的同名字段,若字段是嵌套JSONObject則遞歸合并,若為JSONArray則按索引合并元素。

源碼核心邏輯

public static JSONObject jsonMerge(JSONObject source, JSONObject target) {if (source == null) return target;if (target == null) return source;try {for (String key : source.keySet()) {Object value = source.get(key);// 1. 目標JSON不含該key:直接添加if (!target.containsKey(key)) {target.put(key, value);continue;}// 2. 字段是JSONObject:遞歸合并if (value instanceof JSONObject) {JSONObject mergedValue = jsonMerge((JSONObject) value, target.getJSONObject(key));target.put(key, mergedValue);continue;}// 3. 字段是JSONArray:按索引合并元素(需長度一致)if (value instanceof JSONArray) {JSONArray sourceArray = (JSONArray) value;JSONArray targetArray = target.getJSONArray(key);if (sourceArray.size() != targetArray.size()) {throw new IllegalArgumentException("數組長度不一致:" + key);}for (int i = 0; i < sourceArray.size(); i++) {Object sourceItem = sourceArray.get(i);Object targetItem = targetArray.get(i);// 僅合并數組中的JSONObject元素if (sourceItem instanceof JSONObject && targetItem instanceof JSONObject) {targetArray.set(i, jsonMerge((JSONObject) sourceItem, (JSONObject) targetItem));}}continue;}// 4. 其他類型(字符串、數字等):直接覆蓋target.put(key, value);}} catch (Exception e) {logger.error("JSON合并失敗", e);throw new RuntimeException("合并失敗", e);}return target;
}

關鍵設計

  • 遞歸處理嵌套JSON:若字段是JSONObject,通過自身遞歸實現深層合并(如{"a":{"b":1}}{"a":{"c":2}}合并為{"a":{"b":1,"c":2}})。
  • 數組長度校驗:避免因數組長度不一致導致的索引越界(如合并商品圖片數組時,確保雙方圖片數量相同)。
  • 異常兜底:合并失敗時記錄日志并拋出運行時異常,避免靜默失敗(如生產環境中數據合并錯誤需及時報警)。

2. 安全提取(getStringgetInt):空值處理的最佳實踐

業務痛點:從接口返回的JSON中獲取“用戶手機號”時,若接口未返回該字段,直接調用json.getString("phone")會返回null,后續調用phone.length()將拋出空指針異常。

方法作用:獲取字段值時,若字段不存在或為null,返回預設默認值(字符串返回空串,整數返回0)。

源碼解析

public static String getString(JSONObject jsonObject, String key) {// 若jsonObject為null,或字段值為null,返回空串return Objects.nonNull(jsonObject) && Objects.nonNull(jsonObject.getString(key)) ? jsonObject.getString(key) : "";
}public static int getInt(JSONObject jsonObject, String key) {// 若jsonObject為null,或字段值為null,返回0return Objects.nonNull(jsonObject) && Objects.nonNull(jsonObject.getInteger(key))? jsonObject.getInteger(key): 0;
}

使用示例

JSONObject userJson = JSON.parseObject("{\"name\":\"張三\"}");// 安全獲取存在的字段
String name = JsonUtil.getString(userJson, "name"); // "張三"// 安全獲取不存在的字段(返回空串,避免null)
String phone = JsonUtil.getString(userJson, "phone"); // ""// 安全獲取整數(不存在返回0,避免空指針)
int age = JsonUtil.getInt(userJson, "age"); // 0

3. 自定義轉換(objectToStringIncludeArrays):反射過濾字段

業務場景:用戶列表接口需要返回用戶信息,但僅保留“id”“name”字段,隱藏“password”“idCard”等敏感信息。

方法作用:通過反射獲取對象的指定字段值,生成僅含這些字段的JSON字符串,無需手動創建Map。

源碼核心邏輯

// 核心工具方法:將對象轉換為僅含指定字段的Map
private static Map<String, Object> objectToMapIncludeArrays(Object object, String[] arrays) {Map<String, Object> result = new HashMap<>();for (String fieldName : arrays) {if (object instanceof Map) {// 若對象是Map,直接取key對應的值result.put(fieldName, ((Map<?, ?>) object).get(fieldName));} else {// 若對象是普通實體,通過反射獲取字段值try {Object value = getFieldValueByObject(object, fieldName);result.put(fieldName, value);} catch (Exception e) {logger.error("反射獲取字段值失敗", e);}}}return result;
}// 反射獲取字段值(支持父類字段)
private static Object getFieldValueByObject(Object object, String targetFieldName) throws Exception {Class<?> objClass = object.getClass();// 先查當前類字段for (Field field : objClass.getDeclaredFields()) {if (field.getName().equals(targetFieldName)) {field.setAccessible(true); // 突破私有字段訪問限制return field.get(object);}}// 再查父類字段(如User類繼承自BaseEntity,需獲取父類的id字段)Class<?> superClass = objClass.getSuperclass();if 

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93365.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93365.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93365.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Python 庫手冊:xmlrpc.client 與 xmlrpc.server 模塊

xmlrpc.client 和 xmlrpc.server 是 Python 標準庫中用于構建基于 XML-RPC 協議的遠程過程調用&#xff08;RPC&#xff09;通信模塊。xmlrpc.client 用于編寫客戶端程序&#xff0c;向遠程服務器發起方法調用。xmlrpc.server 用于編寫服務器端&#xff0c;暴露本地方法供遠程客…

渲染篇(一):從零實現一個“微型React”:Virtual DOM的真面目

渲染篇(一)&#xff1a;從零實現一個“微型React”&#xff1a;Virtual DOM的真面目 引子&#xff1a;前端性能的“永恒之問” 在前面兩章中&#xff0c;我們已經奠定了堅實的架構基礎。我們用“任務調度器”建立了聲明式和模塊化的編程范式&#xff0c;并通過對比MVC等模式論…

SWC 深入全面講解

一、核心功能與原理 1. 高性能編譯 Rust 架構優勢&#xff1a;SWC 基于 Rust 編寫&#xff0c;利用 Rust 的性能和并發性優勢&#xff0c;編譯速度比 Babel 快約 20 倍&#xff0c;比 TypeScript 編譯器更快。并行編譯&#xff1a;支持多線程并行處理&#xff0c;在四核基準測試…

XML Expat Parser:深入解析與高效應用

XML Expat Parser:深入解析與高效應用 引言 XML(可擴展標記語言)作為一種廣泛使用的標記語言,在數據交換、存儲和表示中扮演著重要角色。XML Expat Parser 是一個高性能、可擴展的XML解析庫,廣泛應用于各種編程語言中。本文將深入探討XML Expat Parser 的原理、特性以及…

【Python】自動化GIT提交

在日常開發中&#xff0c;我們經常需要頻繁地向 Git 倉庫提交代碼。雖然 git add、git commit、git push 這幾個命令并不復雜&#xff0c;但重復操作容易出錯&#xff0c;也浪費時間。本文將介紹如何使用 Python 腳本自動化完成 Git 提交流程&#xff0c;讓開發更高效&#xff…

基于Qlearning強化學習的水下無人航行器路徑規劃與避障系統matlab性能仿真

目錄 1.引言 2.算法仿真效果演示 3.數據集格式或算法參數簡介 4.算法涉及理論知識概要 5.參考文獻 6.完整算法代碼文件獲得 1.引言 水下無人航行器 (Autonomous Underwater Vehicle, AUV) 的路徑規劃與避障是海洋探索、資源開發和軍事應用中的關鍵技術。傳統的路徑規劃方…

模塊自由拼裝!Python重構DSSAT作物模塊教程(以雜交水稻為例)

基于過程的作物生長模型&#xff08;Process-based Crop Growth Simulation Model&#xff09;在模擬作物對氣候變化的響應與適應、農田管理優化、作物品種和株型篩選、農業碳中和、農田固碳減排等領域扮演著越來越重要的作用。Decision Support Systems for Agrotechnology Tr…

Java項目接口權限校驗的靈活實現

引言 在Java Web開發中&#xff0c;接口權限校驗是保護系統資源安全的關鍵機制。本文將介紹一種靈活、可配置的接口權限校驗方案&#xff0c;通過注解驅動和攔截器實現&#xff0c;既能保證安全性&#xff0c;又能靈活控制哪些接口需要校驗。 設計思路 實現方案的核心設計要點&…

瀚高DB兼容MySQL if函數

文章目錄環境癥狀問題原因解決方案環境 系統平臺&#xff1a;Linux x86-64 Red Hat Enterprise Linux 7 版本&#xff1a;4.5 癥狀 MySQL if函數在瀚高DB當中沒有&#xff0c;源應用在用到if函數時&#xff0c;就會報if函數不存在的錯誤信息。為此&#xff0c;我們需要根據業…

基于深度學習的胸部 X 光圖像肺炎分類系統(六)

目錄 結果指標解讀 一、為什么選擇這些指標&#xff1f; 二、各指標的定義和解讀 1. 準確率&#xff08;Accuracy&#xff09; 2. 損失&#xff08;Loss&#xff09; 3. 精確率&#xff08;Precision&#xff09; 4. 召回率&#xff08;Recall&#xff09; 三、這些指標…

區塊鏈性能優化策略:從理論到實踐

目錄 區塊鏈性能優化策略:從理論到實踐 1. 引言:區塊鏈性能的挑戰 2. 性能評估指標 2.1 核心性能指標 2.2 性能瓶頸分析 3. 分層優化策略 3.1 網絡層優化 3.1.1 Gossip協議改進 3.1.2 網絡分片 3.2 共識層優化 3.2.1 PBFT優化 3.3 數據層優化 3.3.1 狀態樹優化 3.3.2 區塊數據…

【VLLM】open-webui部署模型全流程

目錄 前言 一、租用服務器到服務器連接VScode全流程(可選) 二、下載模型到本地服務器 2.1 進入魔塔社區官網 2.2 選擇下載模型 2.3 執行下載 三、部署VLLM 3.1 參考vllm官網文檔 3.2 查看硬件要求 3.3 安裝vLLM框架 3.4 啟動模型服務 方法1:直接啟動下載的本地模…

辦公自動化入門:如何高效將圖片整合為PDF文檔

將多張圖片合并到一個PDF文件中可以幫助保持特定的順序和布局&#xff0c;同時確保圖像的質量不會因為格式轉換而下降。它是免費&#xff0c;不限次數&#xff0c;批量導入也毫無壓力。操作堪比發朋友圈&#xff1a;拖圖進來 → 選個紙張尺寸 → 點擊轉換 → 指定保存路徑&…

使用寶塔面板搭建 PHP 環境開發一個簡單的 PHP 例子

目錄一、引言二、準備工作2.1 服務器選擇2.2 下載安裝寶塔面板三、使用寶塔面板搭建 PHP 環境3.1 登錄寶塔面板3.2 選擇 Web Server3.3 安裝 PHP3.4 安裝 MySQL 數據庫四、開發一個簡單的 PHP 例子4.1 創建 PHP 文件4.2 編寫 PHP 代碼4.3 設置站點4.4 訪問 PHP 頁面五、常見問題…

AWS WebRTC:我們的業務模式

拉流、卡錄基本流程 設備端&#xff08;攝像機&#xff09; 與 App端 是通過 AWS KVS WebRTC 信令服務進行“點對點連接”的&#xff0c;真正的媒體數據&#xff08;音視頻&#xff09;是通過 WebRTC 的 ICE 通道&#xff08;P2P 或 TURN&#xff09;直接傳輸的&#xff0c;而不…

使用Python,OpenCV,K-Means聚類查找圖像中最主要的顏色

使用Python&#xff0c;OpenCV&#xff0c;K-Means聚類查找圖像中最主要的顏色 分別把跑圖聚類選取1, 2, 3&#xff0c;4, 5, 6, 7&#xff0c;8, 9種主要顏色并繪制colormap顏色圖; 效果圖 分別把跑圖聚類選取3&#xff0c;4, 5&#xff0c;7&#xff0c;9種主要顏色并繪制…

DBAPI 實現分頁查詢的兩種方法

DBAPI 實現分頁查詢的兩種方法 背景 在進行分頁查詢時&#xff0c;用戶通常需要傳入當前頁碼 pageNo 和每頁顯示的條數 pageSize 參數。根據這兩個參數&#xff0c;我們可以從數據庫中查詢出當前頁的數據。以 MySQL 為例&#xff0c;分頁查詢的 SQL 語句如下&#xff1a; se…

第五天上課 SSLPolicy策略和Network Discovery技術

SSL Policy場景1:擁有自家服務器的私鑰&#xff0c;解密訪問自家服務器的ssl流量場景2: 內部用戶訪問互聯網的ssl流量&#xff0c;需要解密并重簽名Correlation and Compliance相關性與合規性配置相關性與合規性策略&#xff0c;在10.1.1.0/24網絡中&#xff0c;當通過Network …

進階07:C#與通用OPC UA通信范例

本節目標&#xff1a; 1&#xff09;安裝軟件&#xff0c;搭建虛擬OPC UA服務器&#xff1b; 2&#xff09;使用UaExpert&#xff0c;讀取OPC UA服務器中的變量&#xff1b; 3&#xff09;編寫Winform程序&#xff0c;讀寫服務器中變量值&#xff0c;創建訂閱觸發事件&#…

大模型微調學習筆記(基于訊飛星辰MaaS速學版)

文章目錄參考資料說明大模型微調入門微調簡介微調步驟數據準備模型選擇訓練方式效果評估模型部署大模型微調&#xff08;基于訊飛星辰Maas&#xff09;構建數據集方法1&#xff1a;預置數據集方法2&#xff1a;創建數據集數據輔助工具數據集劃分模型微調數據配置參數配置模型部…