第一部分:什么是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)
- 定義:整數或浮點數,支持正負、小數、指數形式(如
e
或E
表示科學計數法)。 - 注意:不能包含逗號(如
1,000
不合法),沒有八進制、十六進制表示(只能十進制)。
{"age": 25, // 整數"height": 1.75, // 浮點數"temperature": -5.2, // 負數"distance": 3.6e5 // 科學計數法(3.6×10? = 360000)
}
c. 布爾值(Boolean)
- 定義:只有兩個可能的值:
true
(真)或false
(假),用于表示邏輯狀態。 - 注意:必須小寫(
True
或FALSE
不合法)。
{"isStudent": true,"hasGraduated": false
}
d. 空值(Null)
- 定義:表示 “無值” 或 “缺失值”,僅用
null
表示。 - 注意:必須小寫(
Null
或NULL
不合法),用于明確表示某個鍵不存在值(區別于空字符串""
)。
{"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"));
// 輸出:所在省份:廣東