RunToolz iconRunToolz
Welcome to RunToolz!
XMLJSON資料轉換

XML 到 JSON:比看起來更難

XML 和 JSON 之間的轉換常常產生令人意外的結果。了解屬性映射、陣列處理和命名空間等轉換難點,學習如何正確處理邊緣情況避免資料遺失。

RunToolz Team2026年1月14日5 min read

你有 XML 資料。你的 JavaScript 應用程式需要 JSON。轉換它並繼續,對吧?

除了轉換產生意外結果。應該存在的陣列不存在。屬性最終出現在奇怪的地方。單個項目隨機變成陣列。

XML 和 JSON 對資料建模的方式不同。在它們之間轉換需要決策。

基本不匹配

JSON 有:物件、陣列、字串、數字、布林值、null。

XML 有:元素、屬性、文字內容、命名空間、註解、CDATA。

沒有 1:1 映射。

想親自試試嗎?將 XML 轉換為 JSON

陣列問題

XML 沒有陣列。它有重複的元素。

<users>
  <user>Alice</user>
  <user>Bob</user>
</users>

這應該可能變成:

{"users": {"user": ["Alice", "Bob"]}}

但是這個呢:

<users>
  <user>Alice</user>
</users>

一個元素。它是一個有一個項目的陣列,還是只是一個字串?不同的轉換器有不同的決定。

一致性很重要。如果 user 有時是陣列有時是字串,你的程式碼會損壞。

屬性問題

XML 有屬性。JSON 沒有。

<product id="123">Widget</product>

常見的轉換策略:

{"product": {"_id": "123", "_text": "Widget"}}
{"product": {"@id": "123", "#text": "Widget"}}
{"product": {"$": {"id": "123"}, "_": "Widget"}}

每個慣例都不同。知道你的轉換器產生什麼。

命名空間問題

XML 命名空間創建像 soap:Envelope 這樣的限定名稱。JSON 沒有命名空間的概念。

轉換器要麼:

  • 在屬性名稱中包含前綴:"soap:Envelope"
  • 去除前綴:"Envelope"
  • 為命名空間處理創建巢狀結構

每種方法都有權衡。

實用技巧

保持一致。 選擇一個轉換函式庫並堅持使用它。混合轉換器會產生不一致的結構。

強制陣列。 如果元素可以有多個實例,配置轉換器總是產生陣列,即使對於單個元素也是如此。

測試邊緣情況。 轉換真實資料,而不僅僅是樣本。生產資料中的邊緣情況會讓你驚訝。

考慮替代方案。 如果你控制兩端,考慮從一開始就使用 JSON。來回轉換會失去資訊。

JSON 到 XML 挑戰

反向也有問題。

沒有陣列表示。 JSON 陣列變成重複元素。你需要命名這些元素。

{"items": [1, 2, 3]}

變成什麼?<items><item>1</item>...</items>?「item」從哪裡來?

數字類型。 JSON 區分數字和字串。XML 不區分。123 可能變成 <value>123</value>——那是數字還是字串?

何時轉換

與舊系統整合。 SOAP API 和舊企業系統使用 XML。在邊界處轉換。

處理 XML 資料。 JavaScript 處理 JSON 比 XML 好得多。轉換,處理,如果需要轉換回去。

一次性遷移。 從基於 XML 的系統移動到基於 JSON 的系統。

何時不轉換

往返要求。 XML → JSON → XML 通常會失去資訊。屬性、命名空間、順序。

模式驗證。 XML 有強大的模式語言(XSD)。JSON Schema 不太成熟。

文件處理。 XML 的混合內容模型(帶有嵌入元素的文字)無法乾淨地映射到 JSON。


XML 和 JSON 以不同的方式表示資料。轉換需要關於陣列、屬性和命名空間的選擇。理解你的轉換器的行為並用真實資料測試。