JSON、JSONObject、JSONArray詳細介紹及其應用方式

第一部分:什么是JSON?

🌟比喻:JSON 是「快遞公司統一的 “通用快遞單”」

💡場景代入

你想給朋友寄生日禮物(比如一臺 “游戲機”),這臺游戲機有自己的屬性:

  • 名稱:"游戲機"
  • 價格:2000
  • 配件:["手柄", "充電線"]

但直接把 “游戲機”(代碼里的對象,比如 Java 的 Game 類、Python 的 dict)寄過去,會有問題:

朋友用的 “收貨系統”(另一種編程語言),看不懂你家 “游戲機對象” 的特殊格式(比如 Java 里的 private 修飾符,Python 不認識 )。

這時候,JSON 就像 “通用快遞單” ,幫你把 “游戲機” 的信息,轉換成 全世界快遞員都能看懂的格式

{"name": "游戲機","price": 2000,"accessories": ["手柄", "充電線"]
}
💡核心作用

讓不同系統 / 語言能 “讀懂” 數據,像通用快遞單,全世界物流都認。這個在項目里面調用第三方接口尤為常見:項目里調用第三方接口時 ,就像你和外國公司合作:你說中文,對方說英文,JSON 就是 "翻譯文件",讓兩邊能順利傳數據、做交易~

第二部分:什么是JSONObject?

🌟比喻:JSONObject 是「幫你填 “通用快遞單” 的 “智能填單工具”」

💡場景代入

雖然知道 JSON 是 “通用快遞單”,但手動寫快遞單(拼 JSON 字符串)容易出錯:

  • 忘記加雙引號(比如把 "name" 寫成 name
  • 少打逗號(比如 ["手柄" "充電線"] ,中間沒逗號)

這時候,JSONObject 就像手機里的 “智能填單 APP”

  • 你在 APP 里選 “商品類型”(比如選 “游戲機”),填 “名稱、價格、配件”,APP 會 自動按 JSON 規則生成標準快遞單(幫你加雙引號、逗號,規范格式)。
💡具體解釋(用代碼類比)
  • 在 Java 里,你可以用 JSONObject 類(比如 org.json.JSONObject 庫),像這樣寫:
// 1. 創建一個“填單工具”(JSONObject)
JSONObject jsonObj = new JSONObject();  
// 2. 填信息(自動按 JSON 規則處理)
jsonObj.put("name", "游戲機");   // 鍵自動加雙引號
jsonObj.put("price", 2000);     // 值是數字,規范格式
jsonObj.put("accessories", new JSONArray("[\"手柄\", \"充電線\"]")); // 嵌套數組  // 3. 生成標準 JSON 快遞單(字符串)
String jsonString = jsonObj.toString();  
// 輸出:{"name":"游戲機","price":2000,"accessories":["手柄","充電線"]}
💡核心作用

幫你在代碼里 “安全、規范地拼 JSON” ,避免手動寫字符串出錯,就像填單 APP 自動檢查格式,保證快遞單能被全世界認可!

第三部分:JSON vs JSONObject對比

第四部分:JSON的數據類型

?先總覽一下全部的數據類型,然后下面超詳細講解 JSON 的 6 種數據類型,結合通俗易懂的例子幫助理解~

1. 基本數據類型(4 種)

a. 字符串(String)
  • 定義:由雙引號 "" 包裹的字符序列,可包含字母、數字、符號等。
  • 注意:必須用雙引號(單引號不合法),支持轉義字符(如 \n 換行、\" 表示雙引號)
{"name": "張三",  // 中文字符串"message": "Hello \"World\"",  // 包含轉義的雙引號"path": "C:\\Users\\file.txt"  // 轉義反斜杠(Windows路徑)
}
b. 數字(Number)
  • 定義:整數或浮點數,支持正負、小數、指數形式(如 eE 表示科學計數法)。
  • 注意:不能包含逗號(如 1,000 不合法),沒有八進制、十六進制表示(只能十進制)。
{"age": 25,  // 整數"height": 1.75,  // 浮點數"temperature": -5.2,  // 負數"distance": 3.6e5  // 科學計數法(3.6×10? = 360000)
}
c. 布爾值(Boolean)
  • 定義:只有兩個可能的值:true(真)或 false(假),用于表示邏輯狀態。
  • 注意:必須小寫(TrueFALSE 不合法)。
{"isStudent": true,"hasGraduated": false
}
d. 空值(Null)
  • 定義:表示 “無值” 或 “缺失值”,僅用 null 表示。
  • 注意:必須小寫(NullNULL 不合法),用于明確表示某個鍵不存在值(區別于空字符串 "")。
{"middleName": null,  // 沒有中間名"lastLogin": null  // 從未登錄過
}

2. 復合數據類型(2 種)

a. 對象(Object)
  • 定義:由花括號 {} 包裹的鍵值對集合,鍵是字符串(必須用雙引號),值可以是任意 JSON 數據類型(包括對象自身,支持嵌套)。
  • 結構:鍵和值之間用 : 分隔,鍵值對之間用 , 分隔(最后一個鍵值對后不能有逗號)。
{"user": {  // 嵌套對象"name": "李四","age": 30,"contact": {  // 多層嵌套"phone": "123456789","email": "lisi@example.com"}}
}
b. 數組(Array)
  • 定義:由方括號 [] 包裹的有序值集合,值可以是任意 JSON 數據類型(包括數組自身,支持嵌套),元素之間用 , 分隔(最后一個元素后不能有逗號)。
  • 特點:數組是有序的(通過索引訪問),元素類型可以不同(如同時包含數字、字符串、對象等)。
{"hobbies": ["讀書", "跑步", "編程"],  // 字符串數組"scores": [90, 85.5, null],  // 混合類型數組(數字、空值)"students": [  // 對象數組{"name": "王五", "age": 20},{"name": "趙六", "age": 22}],"matrix": [[1, 2], [3, 4]]  // 嵌套數組(二維數組)
}

第五部分:JSONObject的使用

1. 創建 JSONObject

方式 1:空對象初始化,再逐個添加鍵值

import org.json.JSONObject;public class JsonDemo {public static void main(String[] args) {JSONObject userObj = new JSONObject();userObj.put("name", "張三");  // 存字符串userObj.put("age", 25);       // 存數字userObj.put("isStudent", true); // 存布爾值userObj.put("hobbies", new JSONArray("[\"籃球\",\"音樂\"]")); // 存 JSON 數組(后面講 JSONArray 會細拆)System.out.println(userObj);// 輸出:{"name":"張三","age":25,"isStudent":true,"hobbies":["籃球","音樂"]}}
}

方式 2:用 Map 初始化(適合已有 Map 結構)

import org.json.JSONObject;
import java.util.HashMap;
import java.util.Map;public class JsonDemo {public static void main(String[] args) {Map<String, Object> dataMap = new HashMap<>();dataMap.put("city", "北京");dataMap.put("population", 2184); // 簡單數字示例,實際是千萬級,這里簡化JSONObject cityObj = new JSONObject(dataMap);System.out.println(cityObj);// 輸出:{"city":"北京","population":2184}}
}

方式 3:直接解析 JSON 字符串

如果有現成 JSON 字符串,可直接轉 JSONObject

import org.json.JSONObject;public class JsonDemo {public static void main(String[] args) {String jsonStr = "{\"name\":\"李四\",\"gender\":\"男\"}";JSONObject obj = new JSONObject(jsonStr);System.out.println("解析后的姓名:" + obj.getString("name"));// 輸出:解析后的姓名:李四}
}
2. 讀取 JSONObject 的值

支持按類型精準獲取(避免強制類型轉換報錯),常用方法:

  • getString("key"):取字符串值
  • getInt("key"):取 int 數值
  • getBoolean("key"):取布爾值
  • getJSONObject("key"):取嵌套的 JSONObject
  • getJSONArray("key"):取嵌套的 JSONArray

示例:基于前面創建的 userObj 演示讀取

// 延續前面 userObj 的代碼
String name = userObj.getString("name"); 
int age = userObj.getInt("age");
boolean isStudent = userObj.getBoolean("isStudent");
JSONArray hobbies = userObj.getJSONArray("hobbies");System.out.println("姓名:" + name);      // 輸出:姓名:張三
System.out.println("年齡:" + age);        // 輸出:年齡:25
System.out.println("是否學生:" + isStudent); // 輸出:是否學生:true
System.out.println("愛好列表:" + hobbies);  // 輸出:愛好列表:["籃球","音樂"]
3. 修改 JSONObject 的值

put("key", 新值) 覆蓋已有鍵的值,或新增鍵值對:

// 延續 userObj
userObj.put("age", 26); // 修改 age 的值
userObj.put("email", "zhangsan@example.com"); // 新增 email 鍵值
System.out.println(userObj);
// 輸出:{"name":"張三","age":26,"isStudent":true,"hobbies":["籃球","音樂"],"email":"zhangsan@example.com"}
4. 刪除 JSONObject 的鍵

remove("key") 移除指定鍵:

userObj.remove("isStudent");
System.out.println(userObj);
// 輸出:{"name":"張三","age":26,"hobbies":["籃球","音樂"],"email":"zhangsan@example.com"}
5. 嵌套 JSONObject 處理(重點場景)

實際 JSON 常嵌套多層,比如 “用戶信息里包含地址對象”:

JSONObject address = new JSONObject();
address.put("province", "廣東");
address.put("city", "深圳");JSONObject nestedObj = new JSONObject();
nestedObj.put("name", "王五");
nestedObj.put("address", address); // 把 address 作為嵌套對象存入System.out.println(nestedObj);
// 輸出:{"name":"王五","address":{"province":"廣東","city":"深圳"}}// 讀取嵌套對象的值
JSONObject innerAddr = nestedObj.getJSONObject("address");
System.out.println("所在省份:" + innerAddr.getString("province"));
// 輸出:所在省份:廣東

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

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

相關文章

Linux系統編程--權限管理

權限管理第二講 權限管理1. Shell命令以及運行原理1.1 知識引入1.2 概念介紹1.3 具體示例2. Linux權限問題2.1 權限概念2.2 用戶分類2.3 切換用戶2.4 用戶提權2.5 文件權限管理2.5.1 文件訪問者的分類&#xff08;角色&#xff09;2.5.2 文件類型和訪問權限&#xff08;事物屬性…

【智能硬件】X86和ARM架構的區別

詳細解釋X86架構和ARM架構之間的區別以及它們各自的特點。X86 架構定義與歷史定義&#xff1a;X86是一種計算機處理器體系結構&#xff0c;最初由英特爾公司開發。它是一系列指令集的集合體。歷史&#xff1a;最早的X86架構是Intel 8086處理器&#xff0c;在1978年發布。后續發…

玳瑁的嵌入式日記D13-0806(C語言)

指針1.指針指針 就是地址(地址就是內存單元的編號)指針變量 (結合語境) eg&#xff1a;定義一個指針指針這一類數據 --- 數據類型 --- 指針類型 (1).指針 是什么 (2).指針類型 int a; //int數據類型 a是int型變量 //a的空間 想來存儲 整型數據 2.指針的定義 基類型 * 指針變量名…

密碼學基礎知識總結

密碼學基礎知識總結 一、Base編碼 1. Base系列特征 編碼類型字符集特征Base160-9, A-F密文長度偶數Base32A-Z, 2-7包含數字2-7Base64a-z,0-9,,/,密文長度是8的倍數Base36A-Z,0-9僅支持整數加密Base910-9,a-z,A-Z,特殊符號高密度編碼Base100Emoji表情表情符號組成 2. 典型題型…

PostgreSQL 中 pg_wal文件過多過大的清理方法及關鍵注意事項的總結

PostgreSQL 中 pg_wal文件過多過大的清理方法及關鍵注意事項的總結 以下是針對 PostgreSQL 中 pg_wal 文件過多過大的清理方法及關鍵注意事項的總結 一、安全清理 WAL 文件的完整流程 1. 確認數據庫和備份完整性 備份驗證&#xff1a;確保最近的物理備份&#xff08;如 pg_base…

Django事務支持

1.事務概念 事務是一組不可分割的操作序列&#xff0c;這些操作要么全部執行&#xff0c;要么全部不執行。事務具有四個關鍵屬性&#xff0c;通常稱為 ACID 特性&#xff1a; 原子性&#xff08;Atomicity&#xff09;&#xff1a;事務是一個不可分割的工作單位&#xff0c;事務…

<form> + <iframe> 方式下載大文件的機制

使用 <form> <iframe> 方式下載大文件的機制之所以穩定&#xff0c;核心在于其?分塊傳輸?和?瀏覽器沙箱隔離?設計。以下是技術原理詳解&#xff1a; 一、底層工作機制 ?分塊傳輸協議? 表單提交后&#xff0c;服務器按 Transfer-Encoding: chunked 分塊返回數…

Python--OCR(2)

一、明確 OCR 任務邊界首先定義 OCR 系統的核心目標&#xff1a;場景&#xff1a;印刷體&#xff08;如文檔、發票&#xff09;/ 手寫體&#xff08;如筆記&#xff09;/ 特定場景&#xff08;如車牌、身份證&#xff09;輸入&#xff1a;圖像格式&#xff08;JPG/PNG&#xff…

基于Django的計算機資源爬蟲及可視化系統的設計與實現

文章目錄有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試可以私信博主一、項目背景二、項目目標三、系統架構與技術選型四、系統功能模塊五、應用場景與價值六、項目特色與創新點七、總結每文一語有需要本項目的代碼或文檔以及全部資源&#xff0c;或者部署調試…

SH3001六軸傳感器應用(二)(IIC驅動開發)

一、前言我這邊使用的開發板原本已經做好了該sensor的驅動&#xff0c;但是使用過程中發現&#xff0c;原始驅動sensor是通過事件的方式上報的&#xff0c;加速度和陀螺儀數據并不同步&#xff0c;不滿足使用要求&#xff0c;只有重新寫一個iic的驅動&#xff0c;進行sensor數據…

面試題:基礎的sql命令

基礎的 SQL 命令主要用于對數據庫進行查詢、新增、修改、刪除等操作&#xff0c;可分為以下幾類&#xff1a;一、數據查詢&#xff08;SELECT&#xff09;用于從表中獲取數據&#xff0c;是最常用的命令。 基本語法&#xff1a;SELECT 列名1, 列名2... FROM 表名 WHERE 條件;示…

Leetcode-3488距離最小相等元素查詢

依舊二分&#xff0c;鏈接如下3488. 距離最小相等元素查詢 看題目是個循環數組&#xff0c;記得當時做過一道什么題也是循環數組&#xff0c;就想著直接數組復制一下&#xff0c;然后跟上一道題一樣&#xff0c;用hashmap來存儲value的值以及value對應下標的vector。 和靈神的…

C++中的關聯容器

文章目錄使用關聯容器定義關聯容器關鍵字類型的要求pair類型用作返回類型關聯容器上的操作關聯容器的迭代器關聯容器和算法添加元素刪除元素map的下標操作訪問元素無序容器對關鍵字的要求關聯容器支持高效的關鍵字查找和訪問。兩個主要的關聯容器的類型是map和set。其中map中的…

【Git】git提交代碼報錯Git: husky > pre-commit

git提交代碼報錯原因 這個問題是因為當你在終端輸入git commit -m “XXX”,提交代碼的時候,pre-commit(客戶端)鉤子&#xff0c;它會在Git鍵入提交信息前運行做代碼風格檢查。如果代碼不符合相應規則&#xff0c;則報錯&#xff0c;而它的檢測規則就是根據.git/hooks/pre-commi…

Unity開發者快速認識Unreal 的C++(六)GameMode之PlayerController

繼承關系&#xff1a;Aactor&#xff0c;INavAgentInterface <--- AController<--- PlayerController &#xff0c;PlayerController也是一個Actor,繼承了Actor的一些通用的屬性和工具函數下圖是PlayerController初始化組件的一個子階段從圖中可以得到的信息是&#xf…

Vue 3 服務端渲染(SSR)與客戶端渲染(CSR)的區別及解決方案

1. SSR與CSR的區別1.1. SSR的原理服務端渲染&#xff08;SSR&#xff09;是在服務器端將 Vue 組件渲染為 HTML 字符串&#xff0c;并將其發送給客戶端。這種方式與客戶端渲染&#xff08;CSR&#xff09;不同&#xff0c;后者是在瀏覽器中執行 JavaScript 來生成 HTML。在 SSR …

Matlab快速回顧

一1.數值 顯示 格式format style 設置eg: pi format longE;or2.清除指令clc 清除命令行窗口clear 清除工作區cls3.搜索路徑設置path(path,E:\ads\)oraddpath4.M文件用戶把要實現的命令寫在一個以.m為擴展的文件中&#xff0c;然后由matlab系統進行解讀&#xff0c;最后運行結果…

開源低代碼+AI引擎:百特搭企業級開發平臺的演進

在數字化轉型進入深水區的今天&#xff0c;企業應用開發面臨前所未有的復雜挑戰&#xff1a;既要快速響應業務需求&#xff0c;又要確保系統靈活可控&#xff1b;既要降低技術門檻&#xff0c;又要保障核心安全。傳統開發模式與單一形態的低代碼工具已難以滿足多層次需求。融合…

學習 Android(十五)NDK進階及性能優化

學習 Android&#xff08;十五&#xff09;NDK進階及性能優化 對 NDK 相關知識有了初步的了解之后&#xff0c;我們可以更加深入的去學習 NDK 相關知識&#xff0c;接下來&#xff0c;我們將按照以下步驟進行深入學習&#xff1a; 深入理解JNI調用過程和性能消耗常見 JNI 坑&am…

QT5.12.8 QTabWidget 透明樣式QSS

/* 設置QTabWidget本身 :不加也行*/ QTabWidget#aaa_tabwdt {background: transparent;border: none; /* 移除邊框可能有助于透明效果 */ }/* 標簽頁內的容器部件 :必須加&#xff0c;標簽也才會透明 */ QTabWidget#aaa_tabwdt QWidget, QTabWidget#aaa_tabwdt QFrame {backgro…