iT邦幫忙

2025 iThome 鐵人賽

DAY 11
0
Modern Web

每天一點 API:打造我的生活小工具系列 第 11

Day 11 — JSON vs XML:API 為什麼更愛 JSON

  • 分享至 

  • xImage
  •  

之前一直都是在處理 API 回傳的 JSON,但其實還有一種常見格式是 XML。

今天就來比較 JSON 跟 XML,它們有什麼不同,以及為什麼 API 幾乎都偏好 JSON。

JSON 是什麼?

這個部分在 Day02 已經有學過了。今天再來重新複習一下。

  • JSON(JavaScript Object Notation),中文叫 JavaScript 物件表示法。

  • 它是一種輕量級的資料格式,用來在不同的系統或程式之間傳遞資料。

  • JSON 可以讓資料很容易被人閱讀,也方便電腦快速解析。

JSON 的基本資料類型

JSON 裡面可以包含以下幾種資料:

  • 物件(object):用大括號{}括起來,裡面是一組組「鍵」跟「值」的配對,像是字典或是資料表,例如:
{
  "title": "Clean Architecture",
  "author": "Robert C. Martin",
  "price": 650
}
  • 陣列(array):用中括號 [] 包起來,裡面是一連串有順序的資料,例如:
["apple", "banana", "orange"]
  • 字串(string):放在雙引號中的文字,例如 "Hello World"

  • 數字(number):像是 1、3.14 等數字

  • 布林值(boolean):truefalse

  • 空值(null):表示沒有資料

範例:一本書用 JSON 表示

{
  "id": 123,
  "title": "Clean Architecture",
  "author_id": 42,
  "price": 650,
  "published_at": "2017-09-20"
}

這個例子裡,書本有編號、書名、作者編號、價格和出版日期。

XML 是什麼?

  • XML(eXtensible Markup Language)可擴展標記語言。

  • 它是一種用來儲存和傳輸資料的標記語言,讓不同系統或程式之間能交換資料。

XML 的基本規則:

  1. 成對標籤
  • XML 中所有的標籤都有開始和結束標籤,例如:
<title>Clean Architecture</title>
  1. 必須有且只有一個根元素(Root Element)
  • 所有資料都包在一個最大的標籤裡面。
    例如:
<book>
  ...
</book>
  1. 大小寫要一致
  • <Title><title> 是不同的標籤,大小寫必須一致。

範例:一本書用 XML 表示

<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 vs XML 的比較

  • JSON 比較簡潔,適合網路資料快速傳輸,易於理解和使用。

  • XML 比較複雜,但功能強大,可以支援更多複雜型別,也有註解和更多驗證功能。

  • 現在大多數新系統偏好用 JSON,舊系統和特定應用還是會用到 XML。

為什麼 API 偏好 JSON?

1. 結構簡單、檔案更小、解析速度快
JSON 比較輕巧,資料量小,傳輸更快,程式讀取也更快。

2. Web 與前端原生支援
瀏覽器和前端語言(像是 JavaScript)預設就能直接處理 JSON,開發更方便。

3. 跨語言都有標準函式庫
各種程式語言都有現成的工具來讀寫 JSON,使用起來非常簡單。

4. REST API 幾乎都使用 JSON
因為上述優點,現代網頁服務和手機 App 的 API 幾乎都用 JSON 格式來交換資料。

XML 還存在的場合

雖然 JSON 很流行,但 XML 在特定場合仍不可或缺,例如:

  • SOAP API(較老的企業服務)

  • 發票、報表等正式文件(需要嚴格格式驗證)

  • RSS 與 Atom(網站訂閱與新聞公告)

Content-Type 與資料交換

Content-Type 是什麼?

當伺服器回傳資料時,會帶一個叫做 Content-Type 的標頭,告訴我們資料是什麼格式。

例如:

  • application/json 代表資料是 JSON 格式

  • application/xml 代表資料是 XML 格式

Accept 標頭是什麼?

當我們向 API 伺服器發出請求時,也可以帶上一個叫做 Accept 的標頭,告訴伺服器,你希望收到什麼格式的資料。

例如:

Accept: application/json

意思是「請給我 JSON 格式的資料」。

有時候也可以同時帶多種格式,像是

Accept: application/json, application/xml

這是讓伺服器選擇它能支援的格式。

什麼是內容協商(Content Negotiation)?

  • 內容協商是瀏覽器或程式跟伺服器協商,用什麼格式來傳輸資料的過程。

  • 告訴伺服器想要的格式(用 Accept 標頭),伺服器會回傳它能提供的格式(用 Content-Type 標頭)。

  • 這樣可以讓同一個 API 支援多種格式,讓不同需求的客戶端都能正常使用。

JSON ⇄ XML 轉換

  • 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 Schema 是什麼?

  • 用來定義 JSON 資料的格式和規則。

  • 可以規範欄位名稱(key)、資料型別(文字、數字、布林值等)、哪些欄位是必須填寫、欄位值是否符合特定格式(例如 email、日期)。

  • 這樣能幫程式確認收到的資料是正確且安全的。

XML Schema (XSD) 是什麼?

  • 類似 JSON Schema,但專門用來驗證 XML 文件。

  • 規則更嚴格,通常用在企業級系統、正式文件交換等情況。

  • 確保 XML 的格式和內容都符合預期。

JSON Schema 範例

{
  "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 是必填欄位。

XML Schema (XSD) 範例

<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


上一篇
Day 10 — 誰能拒絕貓咪?隨機貓圖下載實作
系列文
每天一點 API:打造我的生活小工具11
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言