你執行程式碼,看一下 Network 分頁,然後看到這個:"[object Object]" is not
valid JSON。又或者你的 JSON 驗證器說 Expected a JSON object, array or literal,或者解析器卡在最後一項之後的逗號上。這些是開發者最常遇到、也最讓人困惑的 JSON 錯誤。本指南解釋每個錯誤的意思、為什麼會發生,以及如何修正 JSON 語法,讓解析器接受。
「[object Object] is not valid JSON」是什麼意思?
當 JavaScript 不使用 JSON.stringify() 把物件轉成字串時,結果就是文字 [object Object] —— 這是每個物件 .toString() 方法的預設輸出。如果這段字串接著被傳給 JSON.parse(),或當作請求主體送出,就會看到這個錯誤:
SyntaxError: "[object Object]" is not valid JSON解析器正在嘗試解析字面文字 [object Object]。它看到 [,預期是一個 JSON 陣列,接著卻發現沒加引號的字 object,就失敗了。那個方括號是真的存在的 —— 它就是字串 [object Object] 的第一個字元 —— 但後面的內容並不是合法的 JSON 陣列語法。
為什麼 JSON 裡會出現 [object Object]?
根本原因永遠相同:一個 JavaScript 物件在被解析或傳輸前,於程式碼某處被強制轉成了字串。下面是最常見的四種情境:
字串串接
當你把一個物件和字串串接時,JavaScript 會在物件上呼叫 .toString(),它會回傳 [object Object]:
const user = { name: "Alice", age: 30 };
// ❌ 字串串接會強制轉換物件
const body = "data=" + user;
console.log(body); // "data=[object Object]"
// ✅ 使用 JSON.stringify
const body = "data=" + JSON.stringify(user);fetch / XMLHttpRequest 的 body 沒使用 JSON.stringify
把一個普通物件當成 fetch 呼叫的 body 傳進去,會自動被轉成字串:
const payload = { action: "login", user: "alice" };
// ❌ fetch 會把物件強制轉成 "[object Object]"
fetch('/api/login', {
method: 'POST',
body: payload,
});
// ✅ 先序列化,設定 Content-Type
fetch('/api/login', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify(payload),
});樣板字串
把物件直接嵌進樣板字串裡會呼叫 .toString():
const config = { theme: "dark", lang: "en" };
// ❌ 樣板字串會強制轉換
const json = `{"config": ${config}}`;
// '{"config": [object Object]}' ← 非法 JSON
// ✅ 只對物件做序列化
const json = `{"config": ${JSON.stringify(config)}}`;
// '{"config": {"theme":"dark","lang":"en"}}'巢狀 stringify
在一個值已經是「預先序列化過的 JSON 字串」的物件上呼叫 JSON.stringify(),會產生雙重編碼的結果 —— JSON 裡出現的是字串字面值,而不是它所代 表的物件:
const inner = JSON.stringify({ id: 1 }); // '{"id":1}'
const outer = JSON.stringify({ data: inner });
// '{"data":"{\"id\":1}"}' —— data 欄位是字串,不是物件
// 如果之後對外層字串再 JSON.parse(),且想把 data 再當作 JSON 使用,
// 就必須再對 result.data 做一次 JSON.parse()。如何修復 [object Object] JSON 錯誤
修復方法永遠是:在物件被當成字串使用或經由網路傳輸前,確保以 JSON.stringify() 序列化它。一個快速診斷:在程式碼中搜尋所有把出問題的變數當作字串使用的地方,然後在那裡加上 JSON.stringify()。
// 系統化的修復模式
function toJsonBody(obj) {
if (typeof obj === 'string') {
// 已經是字串 —— 使用之前先驗證是合法 JSON
JSON.parse(obj); // 不合法就丟錯
return obj;
}
return JSON.stringify(obj);
}「Expected a JSON Object, Array or Literal」是什麼意思
這個錯誤來自 Firefox 內建的 JSON 檢視器(以及部分 JSON 驗證器),意思是你的 JSON 頂層值並非六種合法 JSON 型別中的任何一種。常見原因:
- 輸入是空字串。
JSON.parse("")會丟這個錯,因為空字串不是合法的 JSON 值。 - 輸入是
undefined。JSON.stringify(undefined)會回傳undefined(不是字串"undefined"),而JSON.parse(undefined)會丟錯。 - 回應是 HTML 而不是 JSON。 伺服器錯誤頁常常會回 HTML。首個字元
<不是合法 JSON。在認定 JSON 本身壞掉前,先在 Network 分頁檢查Content-Type標頭與原始回應內容。 - 檔案開頭有 BOM。 加在 JSON 檔案前面的 UTF-8 BOM(位元組
0xEF 0xBB 0xBF)會讓嚴格的解析器丟這個錯。RFC 8259 明確禁止 JSON 中使用 BOM。
// 解析前對空 / undefined 做保護
function safeParse(text) {
if (!text || typeof text !== 'string') {
throw new TypeError(`Cannot parse ${typeof text} as JSON`);
}
return JSON.parse(text.trimStart()); // trimStart 順便移除不小心的 BOM/空白
}JSON 最後一項之後的逗號:尾隨逗號錯誤
另一個極其常見的 JSON 語法錯誤是尾隨逗號 —— 出現在物件或陣列最後一項之後的那個逗號:
// ❌ 物件裡的尾隨逗號
{
"name": "Alice",
"age": 30,
}
// ❌ 陣列裡的尾隨逗號
["red", "green", "blue",]JSON 的文法要求逗號是用來分隔兩項的 —— 兩側都必須各自有一個值。後面什麼都沒有的逗號違反文法。JavaScript 本身(從 ES5 起)允許尾隨逗號,這也是為什麼開發者經常想都不想就寫上去。
想以程式找出並修復尾隨逗號:
// ⚠️ 正則修復 —— 簡單情境可行,可能破壞字串內容
const fixed = raw.replace(/,\s*([}\]])/g, '$1');
// ✅ 更好:使用懂文法的修復解析器
// 例如 npm 上的 json-repair 函式庫想深入了解這個錯誤,請見 JSON 中的尾隨逗號:為什麼會丟錯以及如何修復。
如何修正 JSON 語法:完整檢查清單
在動用 JSON 修正工具之前,先依這份清單走過,辨識錯誤的類別:
結構
- 每個
{都有對應的},每個[都有對應的]。未關閉的括號是最常見的截斷錯誤之一。 - 沒有尾隨逗號 —— 物件最後一個鍵值對,或陣列最後一項之後不可以有逗號。
- 沒有缺漏的逗號 —— 物件或陣列中除最後一項外的每一項後面都必須接逗號。
字串
- 所有字串使用雙引號。 單引號字串(
'Alice')是 JavaScript 語法,不是 JSON。 - 所有物件鍵都是雙引號字串。 裸鍵(
{ name: "Alice" })是 JavaScript 物件字面語法,不是 JSON。 - 字串內的控制字元要轉義。 字串內的原始換行、定位點與 NUL 位元組都是非法的 —— 請改用
\n、\t、\u0000等轉義。
值
- 布林值為小寫:
true/false,不是True/False/TRUE。 - Null 為小寫:
null,不是None、nil或NULL。 - 沒有
undefined。 JSON 沒有 undefined 型別;請用null或直接省略該鍵。 - 沒有
NaN或Infinity。 這些 JavaScript 值在 JSON 中沒有對應的表示方式。JSON.stringify({x: Infinity})會悄悄產出{"x":null}。
多餘內容
- 沒有註解。
// 行註解與/* 區塊註解 */都不在 JSON 規格內。 - 沒有後綴內容。 合法 JSON 文本只是一個值 —— 它前面除了選擇性的空白外無物,後面也不能有任何內容。
使用 JSON 修正器:何時自動化
一次性除錯時,手動修 JSON 很快。但若是會從外部來源(API、AI 模型輸出、使用者輸入)接收 JSON 的生產管線,你需要 JSON 修正器:能以程式自動修復常見語法錯誤、且不會破壞合法內容的程式或工具。
好的 JSON 修正器會處 理:
- 物件與陣列中的尾隨逗號
- 單引號字串 → 雙引號字串
- 未加引號的鍵 → 雙引號鍵
- Python 字面量(
True、False、None)→ 對應的 JSON 值 - JavaScript 的
// 行與/* 區塊 */註解 → 移除 - Markdown 程式碼柵欄(
```json ... ```)→ 移除 - 未關閉的括號 → 自動關閉
關鍵要求是修正必須懂文法 —— 工具要分辨哪些 token 是結構分隔符、哪些是位於字串值之內,如此才不會誤改剛好含有 ,} 或 True 的字串內容。
想看 JavaScript 中如何實作 JSON 修復的完整逐步說明,請見 如何在 JavaScript 中處理損壞的 JSON。
避免 JSON.stringify 的陷阱(包括循環參照)
一旦你開始永遠以 JSON.stringify 序列化,還有兩種情況容易絆倒人:
- 循環參照會丟錯。 像
const a = {}; a.self = a;之類的值會給你TypeError: Converting circular structure to JSON。三個好替代:用自訂的replacer追蹤已見物件並去掉反向參照;在記憶體深拷貝時改用structuredClone(value);若你真的需要序列化一個含環的圖並之後重建,使用像flatted這樣的函式庫。 - 有損的型別。
JSON.stringify會默默丟掉undefined、函式和Symbol值,並把NaN/Infinity轉成null。請在 stringify 之前 把它們轉成可表示的東西,而不是在解析後再處理。
速查:常見 JSON 錯誤與修法
// 1. [object Object] —— 物件被強制轉成字串
❌ fetch(url, { body: myObject })
✅ fetch(url, { body: JSON.stringify(myObject) })
// 2. 尾隨逗號
❌ { "a": 1, "b": 2, }
✅ { "a": 1, "b": 2 }
// 3. 單引號
❌ { 'name': 'Alice' }
✅ { "name": "Alice" }
// 4. 未加引號的鍵
❌ { name: "Alice" }
✅ { "name": "Alice" }
// 5. Python 布林值
❌ { "active": True }
✅ { "active": true }
// 6. JSON 中的註解
❌ { "debug": true // log everything }
✅ { "debug": true }
// 7. 空字串
❌ JSON.parse("")
✅ JSON.parse(text || "null")
// 8. 把 HTML 錯誤頁當作「JSON」
❌ JSON.parse("<!DOCTYPE html>...")
✅ 在呼叫 response.json() 前先檢查 response.ok 與 Content-Type常見問題
「[object Object] is not valid JSON」是什麼意思?
一個 JavaScript 物件被預設的 .toString() 轉成了字串,產生字面文字 [object Object],而那段文字接著被當成 JSON 解析或送出。修法是在把該值當字串使用前以 JSON.stringify() 序列化。
在 fetch 請求中如何修復 [object Object] 錯誤?
設定 body: JSON.stringify(payload),並加上 Content-Type: application/json 標頭。把裸物件當成 body 傳會被強制轉成 [object Object]。
「Expected a JSON object, array or literal」是什麼?
當頂層值不是六種 JSON 型別之一時,Firefox 與部分驗證器會顯示這個訊息 —— 通常是因為輸入為空、undefined、是 HTML 而非 JSON,或以位元組順序記號開頭。請先檢查 response.ok 與 Content-Type 標頭。
最常見的 JSON 語法錯誤有哪些?
尾隨逗號、單引號、未加引號的鍵、Python 字面量(True/None)、註解,以及 NaN/Infinity。每個都有專文:見 尾隨逗號、unexpected-token 錯誤、unexpected end of input,以及 不合法的控制字元。
線上修復 JSON 語法 —— 不需任何設定
如果你現在就有一段需要修正的損壞 JSON,JSON Fix 會自動修復上面提到的所有錯誤。貼上你的 JSON —— 不論多壞 —— 按下 Repair & Format,就能拿回語法正確且已格式化的 JSON。工具完全在你的瀏覽器中執行:不會傳送任何資料到伺服器,處理敏感負載也安全。
- JSON Fix —— 即時修復並格式化損壞的 JSON
- 如何在 JavaScript 中處理損壞的 JSON —— 把優雅的 JSON 修復加進你自己的應用程式
- Unexpected Token o in JSON at Position 1 —— [object Object] 錯誤的近親
- 什麼是 JSON? —— JSON 格式、語法與資料型別的完整指南
- JSON Diff —— 比對原始與修正後的 JSON,驗證修復是否正確