什麼是 JSON?附範例的白話指南
JSON(JavaScript Object Notation)是一種簡單的文字格式,用來以名稱配對值的方式寫下結構化資料,例如一位客戶、一筆訂單或一份產品清單。它對人類來說容易閱讀,對程式來說也容易產生與解析。當 App 與服務透過網路交換資料時,JSON 是目前最常見的格式。
用 AI 製作 App 時為什麼 JSON 很重要
即使你從來不寫程式,也會頻繁遇到 JSON:
- API。 當你的 App 畫面從後端載入資料,或你的後端呼叫金流、郵件或 AI 服務時,資料通常會以 JSON 傳輸。請參閱什麼是 API。
- 設定檔。 許多專案設定檔都是 JSON,例如
package.json,它列出一個 JavaScript 專案所依賴的套件。 - 資料庫。 Postgres 可以把 JSON 存在一個欄位中(
jsonb類型),適合用來存放不適合整齊列與欄的資料。請參閱什麼是 Postgres。 - AI 輸出。 當你希望 AI 模型回傳程式能使用的內容,例如一份標籤清單或擷取出的發票欄位,通常會要求它輸出 JSON。
- 錯誤訊息與紀錄。 許多錯誤都是以 JSON 形式出現的,閱讀它通常是找出問題最快的方法。
會閱讀 JSON,你就能檢查 App 實際收到了什麼、發現遺漏的欄位,並且向 AI 製作工具精確描述問題。
日常比喻
想像一張紙本表單:姓名:,電話:,電子報:☐ 是 ☐ 否。 每個填寫的地方都是一個標籤加上旁邊的值。JSON 就是把這張表單用文字寫出來,採用嚴格的排版,讓電腦無需猜測就能讀取。就像表單一樣,JSON 也可以有巢狀的區塊(例如包含街道、城市與郵遞區號的地址區塊),以及清單(例如好幾組電話號碼)。
JSON 的樣子
以下是一筆 JSON 格式的預約資料:
{
"id": 5001,
"customer": "Lena Park",
"service": "Haircut",
"startsAt": "2026-10-03T14:00:00Z",
"price": 35.5,
"paid": false,
"notes": null,
"extras": ["beard trim", "hot towel"],
"contact": {
"email": "lena@example.com",
"phone": "+44 20 7946 0000"
}
}
閱讀方式:
- 大括號
{ }包住一個物件,也就是一組名稱與值的配對。 - 每一組配對的格式是
"名稱": 值,並以逗號分隔。 - 方括號
[ ]包住一個陣列,也就是有順序的清單。 - 物件與陣列可以互相巢狀包含,就像
contact與extras一樣。
六種值類型
JSON 只有六種值類型。這份小清單正是它能在各處通用的重要原因之一。
| 類型 | 範例 | 說明 |
|---|---|---|
| 字串(文字) | "Lena Park" | 一律使用雙引號 |
| 數字 | 35.5、-2、1e6 | 不加引號;不能有貨幣符號 |
| 布林值 | true、false | 小寫,不加引號 |
| Null | null | 表示「沒有值」 |
| 物件 | { "city": "Leeds" } | 具名稱的值 |
| 陣列 | [1, 2, 3] | 有順序的清單;項目可以是任何類型 |
JSON 沒有日期類型。日期通常以字串表示,常用的是上面所示的 ISO 8601 格式(2026-10-03T14:00:00Z,其中 Z 代表 UTC)。大家約定好同一種格式,就能避免整類時區相關的錯誤。
嚴格的規則(錯誤的來源)
JSON 比外表看起來更不寬容。以下這些都是無效的:
{ name: "Lena" } ← 鍵沒有使用雙引號
{ 'name': 'Lena' } ← 使用單引號
{ "a": 1, "b": 2, } ← 結尾逗號
{ "a": 1 "b": 2 } ← 缺少逗號
{ "a": 1 // comment } ← 不允許註解
你會遇到的大多數「Unexpected token」錯誤,都屬於上述其中一種。JSON 驗證或格式化工具會準確指出出錯的那一行。
實際範例:JSON 在 App 中的流動
一位客戶在美髮沙龍 App 中預約剪髮。以下是 JSON 出現的地方:
- 預約表單把這段內容送到 App 的後端:
{ "service": "Haircut", "startsAt": "2026-10-03T14:00:00Z", "name": "Lena Park" }
- 後端把預約儲存到資料庫中,並回傳狀態
201 Created以及:
{ "id": 5001, "status": "confirmed" }
- 如果該時段已被預約,後端可能改為回傳狀態
409 Conflict以及:
{ "error": "slot_taken", "message": "That time was just booked. Please pick another." }
頁面會讀取 status 或 error,並顯示正確的訊息。如果頁面顯示的是空白畫面,打開瀏覽器的開發者工具(Network 分頁)就能看到這段 JSON,通常是找出問題最快的線索。
關鍵術語
| 術語 | 意義 |
|---|---|
| 鍵(Key) | 名稱與值配對中的名稱,例如 "email"。 |
| 解析(Parse) | 把 JSON 文字轉換成程式可以使用的資料。 |
| 序列化/字串化(Serialize / stringify) | 把資料轉換成 JSON 文字,以便傳送或儲存。 |
| 承載資料(Payload) | 請求或回應中傳送的資料。 |
| 結構定義(Schema) | 描述資料應有的形狀,包括有哪些欄位、各是什麼類型。JSON Schema 是撰寫它的標準方式。 |
| JSONB | Postgres 的二進位 JSON 欄位類型,可以建立索引並查詢。 |
| NDJSON / JSON Lines | 每行一個 JSON 物件,常見於紀錄檔與串流資料。 |
常見迷思
- 「JSON 就是 JavaScript。」 它的語法源自 JavaScript,但它與語言無關;Python、Java、C#、Go 等語言都能讀取它。
- 「數字加引號也沒關係。」
"35"是字串,不是數字。混用會造成錯誤,例如"35" + "5"會變成"355"。金額通常更適合以整數的分為單位儲存(3550),以避免捨入問題。 - 「JSON 只是資料,所以很安全。」 JSON 可以承載任何東西,包括機密。不要把 API 金鑰放進會傳送到瀏覽器的 JSON 中。
- 「把所有東西都放進 JSON 欄位。」 用來存放彈性的額外資訊很方便,但需要搜尋、篩選或關聯的資料,通常應該放在正式的欄位中。
- 「AI 一定會回傳有效的 JSON。」 模型可能會加入多餘的文字,或破壞格式。許多供應商提供結構化輸出模式;你的程式仍然應該檢查收到的內容。
可以向 AI 製作工具提出的要求
- 「給我看這個端點回傳的 JSON 範例。」
- 「錯誤要以 JSON 回傳,包含
error代碼與易讀的message。」 - 「日期以 UTC 的 ISO 8601 字串儲存,只在畫面上才轉換為當地時間。」
- 「金額以整數分為單位儲存。」
- 「在伺服器端驗證收到的 JSON,並拒絕缺少欄位或欄位類型錯誤的請求。」
- 「呼叫 AI 模型時,要求它以這個確切的格式輸出 JSON,並在使用前先檢查。」
Mythex 中的 JSON
在 Mythex 中你不需要手寫 JSON,只要描述你要的內容,Agent 就會撰寫負責傳送與讀取它的程式碼。不過認識 JSON 仍然有幫助:當某個地方出錯時,把 JSON 錯誤貼到聊天中,能給 Agent 一個精確的線索。文件中的 REST API 後端食譜 一開始就要求提供「清楚的 JSON 錯誤」,而 整合任何 API 食譜則涵蓋呼叫外部服務的做法。若想了解更完整的背景,請參閱 REST 與 GraphQL,以及 如何除錯 AI 製作的 App。
常見問題
用簡單的話來說,什麼是 JSON?
JSON(JavaScript Object Notation)是一種純文字格式,用來以「名稱與值」的方式寫下結構化資料,例如 "name": "Lena"。幾乎所有網路 API 都用它來來回傳送資料,許多 App 也用它來儲存設定與資料。
JSON 是一種程式語言嗎?
不是。JSON 是一種資料格式,不是語言。它本身無法執行任何動作,只用來描述資料。雖然它源自 JavaScript,但幾乎所有程式語言都能讀寫它。
JSON 和 JavaScript 物件有什麼差別?
兩者外觀相似,但 JSON 的規則更嚴格。在 JSON 中,每個鍵都必須使用雙引號,字串也使用雙引號,不能有註解與結尾逗號,而且值只能是字串、數字、true、false、null、物件與陣列。
為什麼我的 JSON 顯示無效?
常見原因包括:最後一個項目後面有結尾逗號、使用單引號而非雙引號、項目之間缺少逗號、括號沒有關閉,或是加入了註解。把內容貼到 JSON 驗證工具中,它會指出出錯的那一行。