之前一直都是在處理 API 回傳的 JSON,但其實還有一種常見格式是 XML。
今天就來比較 JSON 跟 XML,它們有什麼不同,以及為什麼 API 幾乎都偏好 JSON。
這個部分在 Day02 已經有學過了。今天再來重新複習一下。
JSON(JavaScript Object Notation),中文叫 JavaScript 物件表示法。
它是一種輕量級的資料格式,用來在不同的系統或程式之間傳遞資料。
JSON 可以讓資料很容易被人閱讀,也方便電腦快速解析。
JSON 裡面可以包含以下幾種資料:
{}
括起來,裡面是一組組「鍵」跟「值」的配對,像是字典或是資料表,例如:{
"title": "Clean Architecture",
"author": "Robert C. Martin",
"price": 650
}
[]
包起來,裡面是一連串有順序的資料,例如:["apple", "banana", "orange"]
字串(string):放在雙引號中的文字,例如 "Hello World"
數字(number):像是 1、3.14 等數字
布林值(boolean):true
或 false
空值(null):表示沒有資料
{
"id": 123,
"title": "Clean Architecture",
"author_id": 42,
"price": 650,
"published_at": "2017-09-20"
}
這個例子裡,書本有編號、書名、作者編號、價格和出版日期。
XML(eXtensible Markup Language)可擴展標記語言。
它是一種用來儲存和傳輸資料的標記語言,讓不同系統或程式之間能交換資料。
<title>Clean Architecture</title>
<book>
...
</book>
<Title>
和 <title>
是不同的標籤,大小寫必須一致。<book>
<id>123</id>
<title>Clean Architecture</title>
<author_id>42</author_id>
<price>650</price>
<published_at>2017-09-20</published_at>
</book>
這裡<book>
是根元素,裡面有書的編號、書名、作者編號、價格和出版日期。
JSON 比較簡潔,適合網路資料快速傳輸,易於理解和使用。
XML 比較複雜,但功能強大,可以支援更多複雜型別,也有註解和更多驗證功能。
現在大多數新系統偏好用 JSON,舊系統和特定應用還是會用到 XML。
1. 結構簡單、檔案更小、解析速度快
JSON 比較輕巧,資料量小,傳輸更快,程式讀取也更快。
2. Web 與前端原生支援
瀏覽器和前端語言(像是 JavaScript)預設就能直接處理 JSON,開發更方便。
3. 跨語言都有標準函式庫
各種程式語言都有現成的工具來讀寫 JSON,使用起來非常簡單。
4. REST API 幾乎都使用 JSON
因為上述優點,現代網頁服務和手機 App 的 API 幾乎都用 JSON 格式來交換資料。
雖然 JSON 很流行,但 XML 在特定場合仍不可或缺,例如:
SOAP API(較老的企業服務)
發票、報表等正式文件(需要嚴格格式驗證)
RSS 與 Atom(網站訂閱與新聞公告)
當伺服器回傳資料時,會帶一個叫做 Content-Type
的標頭,告訴我們資料是什麼格式。
例如:
application/json
代表資料是 JSON 格式
application/xml
代表資料是 XML 格式
當我們向 API 伺服器發出請求時,也可以帶上一個叫做 Accept 的標頭,告訴伺服器,你希望收到什麼格式的資料。
例如:
Accept: application/json
意思是「請給我 JSON 格式的資料」。
有時候也可以同時帶多種格式,像是
Accept: application/json, application/xml
這是讓伺服器選擇它能支援的格式。
內容協商是瀏覽器或程式跟伺服器協商,用什麼格式來傳輸資料的過程。
告訴伺服器想要的格式(用 Accept 標頭),伺服器會回傳它能提供的格式(用 Content-Type 標頭)。
這樣可以讓同一個 API 支援多種格式,讓不同需求的客戶端都能正常使用。
JSON 和 XML 都是用來存放資料的格式,但表示方式不一樣。
在程式中,我們常用字典(dict)來代表 JSON 的資料結構。
轉換就是讓字典變成 XML 格式,或是把 XML 變回字典。
Python 有一個很方便的套件叫做 xmltodict,可以在字典和 XML 之間互轉。
這比手動自己寫轉換程式簡單很多。
範例:把一本書的字典轉成簡單的 XML
import xmltodict
# 用Python字典表示一本書
book_dict = {
"book": {
"id": 123,
"title": "Clean Architecture",
"author_id": 42,
"price": 650
}
}
# 把字典轉成 XML 字串
book_xml = xmltodict.unparse(book_dict, pretty=True)
print(book_xml)
這樣就能快速把字典轉成符合 XML 格式的文字。
用來定義 JSON 資料的格式和規則。
可以規範欄位名稱(key)、資料型別(文字、數字、布林值等)、哪些欄位是必須填寫、欄位值是否符合特定格式(例如 email、日期)。
這樣能幫程式確認收到的資料是正確且安全的。
類似 JSON Schema,但專門用來驗證 XML 文件。
規則更嚴格,通常用在企業級系統、正式文件交換等情況。
確保 XML 的格式和內容都符合預期。
{
"type": "object",
"properties": {
"id": { "type": "number" },
"title": { "type": "string" },
"author_id": { "type": "number" },
"price": { "type": "number" }
},
"required": ["id", "title"]
}
這個 Schema 說明:資料必須是物件,有 id(數字)、title(文字)、author_id(數字)、price(數字)這些欄位,且 id 和 title 是必填欄位。
<xs:schema xmlns:xs="http://www.w3.org/2001/XMLSchema">
<xs:element name="book">
<xs:complexType>
<xs:sequence>
<xs:element name="id" type="xs:int"/>
<xs:element name="title" type="xs:string"/>
<xs:element name="author_id" type="xs:int" minOccurs="0"/>
<xs:element name="price" type="xs:decimal" minOccurs="0"/>
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:schema>
這個 XSD 說明 <book>
這個 XML 標籤內必須有 id(整數)、title(字串),而 author_id 和 price 是可選的。
學會 JSON 與 XML 的差異
了解 為什麼 API 偏好 JSON
認識 Content-Type、Accept 與內容協商
初步認識 JSON Schema 與 XML Schema