如何第一時間看到新文章?
收藏本部落格列表頁,並在首頁與工具聚合頁留意指南入口。閱讀文章無需註冊或訂閱電子報。
深入淺出講解 JSON 定義、語法規範、資料類型,以及在 JavaScript 與 Python 中的實戰操作。
JSON 是 JavaScript Object Notation(JavaScript 物件表示法)的縮寫,它是一種輕量級的資料儲存和傳輸格式。JSON 的核心設計理念是讓資料既易於人類閱讀,又便於機器解析,這種雙重特性使其成為現代 Web 開發中最重要的資料交換格式之一。
JSON 最初源於 JavaScript 語言,但它已經發展成為完全獨立於程式語言的資料格式標準。無論是 Python、Java、PHP 還是 Ruby,幾乎所有現代程式語言都原生支援 JSON 的讀取和生成。這種跨平台的相容性使 JSON 成為伺服器與客戶端之間、不同系統之間資料傳輸的首選格式。
JSON 採用純文字格式,這意味著它可以在任何支援文字處理的環境中傳輸和儲存,無需依賴特定的軟體或平台。
JSON 的「輕量級」特性體現在兩個方面:首先,它的語法結構極其簡潔,不包含任何冗餘的標記或格式要求;其次,JSON 檔案通常比同等資料的 XML 檔案小 30%-50%,這在需要頻繁傳輸大量資料的 Web 應用中能顯著降低網路開銷和載入時間。
JSON 的語法設計遵循嚴格的規則,這些規則確保了資料格式的一致性和可解析性。理解這些基本規則是正確使用 JSON 的基礎。
"name": "John"{} 用於包裹物件,表示一個無序的鍵值對集合[] 用於包裹陣列,表示一個有序的值列表在實際開發中,開發者經常會遇到一些 JSON 格式的常見錯誤。以下是需要特別注意的「陷阱」:
1. JSON 不支援註解JSON 規範中明確不支援任何形式的註解。如果您在 JSON 檔案中加入 // 或 /* */ 格式的註解,解析器會直接報錯。如果需要在 JSON 中包含說明性資訊,可以考慮在資料中加入特殊的鍵,如 "_comment": "這是說明文字",但這種做法並不推薦用於生產環境。
這是一個極其常見的錯誤。在 JavaScript 中,您可以使用單引號或雙引號來定義字串,但在 JSON 中,所有的字串必須使用雙引號。例如,{'name': 'John'} 是無效的 JSON,必須寫成 {"name": "John"}。
在 JavaScript 中,物件或陣列的最後一個元素後可以有一個可選的逗號,但在 JSON 中這是嚴格禁止的。{"name": "John",} 會導致解析錯誤,正確的格式是 {"name": "John"}。
JSON 中所有的鍵必須是字串類型,並且必須用雙引號包裹。像 {age: 25} 這樣的寫法在 JavaScript 中是合法的,但在 JSON 中無效,必須寫成 {"age": 25}。
JSON 支援六種核心資料型別,每種類型都有其特定的語法規則和用途。理解這些資料型別是正確建構 JSON 資料結構的關鍵。
字串是 JSON 中最常用的資料型別,用於表示文字資訊。字串必須用雙引號包裹,可以包含任何 Unicode 字元。JSON 字串支援常見的跳脫字元,如 \n(換行)、\t(製表符)、\"(雙引號)等。
{
"name": "張三",
"email": "zhangsan@example.com",
"address": "北京市朝陽區\n建國路88號"
}JSON 中的數字類型包括整數和浮點數,不支援八進制和十六進制格式。數字可以是正數、負數,也可以包含小數部分或使用科學計數法表示。
{
"age": 28,
"price": 99.99,
"temperature": -5,
"largeNumber": 3.14e10
}物件是無序的鍵值對集合,用花括號包裹。每個鍵值對中的鍵必須是字串,值可以是任何合法的 JSON 資料型別。物件可以嵌套,形成複雜的資料結構。
{
"user": {
"profile": {
"name": "李四",
"age": 32
},
"preferences": {
"theme": "dark",
"language": "zh-TW"
}
}
}陣列是有序的值列表,用方括號包裹。陣列中的值可以是任何 JSON 資料型別,包括混合類型。陣列特別適合表示集合資料,如使用者列表、標籤等。
{
"users": ["Alice", "Bob", "Charlie"],
"scores": [95, 87, 92, 88],
"mixed": [1, "two", true, null]
}布林值只有兩個可能的值:true 或 false。注意這些值是小寫的,並且不需要引號包裹。
{
"isActive": true,
"hasPermission": false,
"isPremium": true
}null 表示一個空值或不存在的值。它同樣不需要引號包裹,且必須小寫。
{
"middleName": null,
"avatar": null,
"lastLoginTime": null
}JSON 和 XML 都是用於資料儲存和傳輸的格式,但它們在設計理念、語法結構和使用場景上存在顯著差異。以下對比表幫助您快速理解兩者的區別:
| 特性 | JSON | XML |
|---|---|---|
| 全稱 | JavaScript Object Notation | eXtensible Markup Language |
| 檔案大小 | 更小,通常比 XML 小 30%-50% | 較大,需要閉合標籤 |
| 可讀性 | 簡潔清晰,易於閱讀 | 結構清晰但較為冗長 |
| 解析速度 | 更快,可使用標準函數解析 | 較慢,需要 XML 解析器 |
| 資料型別 | 支援多種原生資料型別 | 僅支援文字,需要自行定義型別 |
| 陣列支援 | 原生支援陣列 | 不支援陣列概念 |
| 註解 | 不支援註解 | 支援註解 |
| 命名空間 | 不支援 | 支援命名空間 |
| 適用場景 | Web API、行動應用、設定檔 | 企業級文件、複雜資料結構 |
選擇建議:對於現代 Web 開發和行動應用,JSON 通常是更好的選擇,因為它更輕量、解析更快、與 JavaScript 的天然相容性更好。XML 則更適合需要複雜文件結構、命名空間支援或嚴格驗證的企業級應用場景。
在實際開發中,最常用的 JSON 操作是將 JSON 字串轉換為程式中的物件,以及將物件轉換為 JSON 字串。以下是在 JavaScript 和 Python 中的具體實作方法。
JavaScript 提供了兩個核心方法來處理 JSON 資料:JSON.parse() 和 JSON.stringify()。
// JSON 字串
const jsonString = '{"name": "張三", "age": 28, "city": "北京"}';
// 解析為 JavaScript 物件
const obj = JSON.parse(jsonString);
// 使用解析後的物件
console.log(obj.name); // 輸出: 張三
console.log(obj.age); // 輸出: 28
// 處理巢狀結構
const complexJson = `{
"user": {
"profile": {"name": "李四"},
"skills": ["JavaScript", "Python"]
}
}`;
const data = JSON.parse(complexJson);
console.log(data.user.profile.name); // 輸出: 李四
console.log(data.user.skills[0]); // 輸出: JavaScript2. JSON.stringify() - 將 JavaScript 物件轉換為 JSON 字串// JavaScript 物件
const user = {
name: "王五",
age: 32,
email: "wangwu@example.com",
isActive: true
};
// 轉換為 JSON 字串
const jsonString = JSON.stringify(user);
console.log(jsonString);
// 輸出: {"name":"王五","age":32,"email":"wangwu@example.com","isActive":true}
// 格式化輸出(帶縮排)
const prettyJson = JSON.stringify(user, null, 2);
console.log(prettyJson);
/* 輸出:
{
"name": "王五",
"age": 32,
"email": "wangwu@example.com",
"isActive": true
}
*/
// 只包含特定屬性
const filtered = JSON.stringify(user, ["name", "email"], 2);
console.log(filtered);
/* 輸出:
{
"name": "王五",
"email": "wangwu@example.com"
}
*/Python 內建了 json 模組,提供了與 JavaScript 類似的功能。
import json
# JSON 字串
json_string = '{"name": "張三", "age": 28, "city": "北京"}'
# 解析為 Python 字典
data = json.loads(json_string)
# 使用解析後的資料
print(data['name']) # 輸出: 張三
print(data['age']) # 輸出: 28
# 處理巢狀結構
complex_json = '''
{
"user": {
"profile": {"name": "李四"},
"skills": ["JavaScript", "Python"]
}
}
'''
data = json.loads(complex_json)
print(data['user']['profile']['name']) # 輸出: 李四
print(data['user']['skills'][0]) # 輸出: JavaScript2. json.dumps() - 將 Python 物件轉換為 JSON 字串import json
# Python 字典
user = {
"name": "王五",
"age": 32,
"email": "wangwu@example.com",
"is_active": True,
"skills": ["Python", "JavaScript", "Go"]
}
# 轉換為 JSON 字串
json_string = json.dumps(user)
print(json_string)
# 輸出: {"name": "王五", "age": 32, "email": "wangwu@example.com", ...}
# 格式化輸出(帶縮排)
pretty_json = json.dumps(user, indent=2, ensure_ascii=False)
print(pretty_json)
""" 輸出:
{
"name": "王五",
"age": 32,
"email": "wangwu@example.com",
"is_active": true,
"skills": [
"Python",
"JavaScript",
"Go"
]
}
"""
# 按鍵排序
sorted_json = json.dumps(user, sort_keys=True, indent=2)
print(sorted_json)根據 Oracle 和 DigitalOcean 的分析,JSON 在現代軟體開發中扮演著不可替代的角色:
API 通訊:幾乎所有的現代 RESTful API 都使用 JSON 作為資料交換格式,因為它輕量、易解析,並且與 JavaScript 天然相容。資料庫儲存:NoSQL 資料庫(如 MongoDB、Couchbase)原生支援 JSON 格式儲存,主流的關聯式資料庫(如 Oracle、PostgreSQL、MySQL)也開始提供 JSON 資料型別支援,使開發者能夠在關聯式資料庫中靈活地儲存和查詢 JSON 資料。設定檔:越來越多的應用程式和開發工具採用 JSON 作為設定檔格式,包括 package.json(Node.js)、tsconfig.json(TypeScript)、.vscode/settings.json(VS Code)等,這是因為 JSON 的簡潔性和可讀性優於傳統的 INI 或 XML 格式。致力於為開發者提供最佳的 JSON 處理工具
更多文章即將發布...
返回部落格關於跟進更新、選題與互動方式。
收藏本部落格列表頁,並在首頁與工具聚合頁留意指南入口。閱讀文章無需註冊或訂閱電子報。
圍繞 JSON 驗證、格式化、轉換與除錯流程,以及 JSON Work 工具更新,與站內工具的本地能力互相呼應。
可以。請透過關於頁的聯絡方式或 GitHub 回饋;我們會優先安排貼近真實開發情境的教學。