XML轉JSON轉換器

將XML資料轉換為JSON。可以把老舊的XML API響應、SOAP報文或RSS/Atom訂閱源轉換為JSON——屬性歸入@attributes、文本歸入#text、重複元素變為陣列——全部在瀏覽器中完成。

把 XML 轉成 JSON

有時您想用慣用的 JSON 形狀,來看一眼老舊的 XML 介面、SOAP 往來,或是 RSS/Atom 來源的內容。本工具會把貼入的 XML 轉換過來,並在瀏覽器內部把整件事做完,貼入的東西不會被送往任何地方。

之所以需要一套約定,正因為 XML 與 JSON 持有資料的方式根本不同。 XML 區分屬性與文字,且允許同名元素出現任意多次,這兩樣 JSON 都沒有。於是屬性被放進 @attributes,元素直接持有的字串放進 #text,重複出現的元素則化為陣列。躲不開的是:當可重複的元素恰好只出現一次時,歧義便隨之而來。 在原本的 XML 裡它仍是「可重複之物的一次」,到了 JSON 卻看著像個單值,因此接收端的程式寫成同時應付一個與多個,才最穩妥。

使用方法

  1. 貼入 XML SOAP 回應也好,RSS 來源也好,都可原樣貼入。
  2. 查看轉換結果 屬性歸於 @attributes 鍵下,文字歸於 #text。
  3. 對照結構 與原本的 XML 並排,可確認哪個元素落到了哪個鍵下。
  4. 複製或下載 可直接貼進程式,也可存為檔案。

用好本工具的小技巧

  • 帶有屬性的元素會被歸入 @attributes 物件中,與元素本身的文本或子元素分開存放。
  • 當一個元素同時包含屬性與子元素或文本時,文本部分會存入 #text 鍵,不會與屬性值混淆。
  • 同名的兄弟元素多次出現時會自動合併為陣列:3個 <item> 標籤會變成含3個元素的陣列,只有1個時則保持為普通物件。
  • 不含屬性、文本、子元素的空元素(例如 <flag/>)會被轉換為 null。
  • xmlns 等名稱空間字首不會被拆分,元素仍以 ns:tag 這樣的完整名稱作為鍵。

這些情境會用到

把 XML 介面接進只吃 JSON 的程式

接收的一方只認 JSON 時,可先把轉換後的形狀定下來。

解析 RSS 或 Atom 來源

把來源裡的項目變成 JSON,用指令稿照原樣跑起來便容易多了。

讀懂 SOAP 回應的內容

SOAP 因巢狀與命名空間而難讀,一旦把層級攤成 JSON 便好跟多了。

為測試準備夾具

可由真實的 XML 回應推出一份 JSON 模擬資料。

轉換約定的術語

@attributes
收納 XML 元素屬性的鍵。 因 JSON 並無屬性這一概念,故給它們另闢一鍵。
#text
收納元素直接持有的字串的鍵。當一個元素既有屬性又有子元素時,它便成了必需。
重複元素
以同一名稱出現不止一次的元素。在 JSON 中化為陣列,但只出現一次時會呈現為單值,而非只含一項的陣列。
命名空間前綴
soap:Body 中的 soap: 部分。在 JSON 中它作為鍵名的一部分原樣留存。
混合內容
文字與子元素同處一個元素之內。JSON 並無與之對應的結構,這裡也最容易在轉換中遺失資訊。
根元素
位於 XML 最頂端的唯一元素。在 JSON 中它成為最外層的鍵。

常見問題

每個元素的屬性會被歸入 @attributes 鍵下的物件中。例如 <book category="fiction"> 會轉換為 {"@attributes": {"category": "fiction"}, ...},與元素本身的值(文本或子元素)分開存放,不會混淆。

當同一父元素下存在多個同名的兄弟元素時,會自動合併為陣列。例如存在兩個 <book> 標籤,轉換後 book 鍵的值就是一個含2個元素的陣列;只有一個時則保持為普通物件。

最常見的原因是結束標籤缺失或名稱不匹配(閉合標籤與開始標籤名稱不同)。此外XML要求只能有一個根元素,如果像 <a>...</a><b>...</b> 這樣在頂層並列多個元素也會導致轉換失敗。

本工具僅支援XML轉JSON這一個方向。如果需要單獨格式化或校驗JSON、XML,請使用本站的其他格式化工具。

名稱空間字首不會被拆分,元素仍以 ns:tag 這樣的形式作為鍵名。由於不會解析名稱空間(即字首與URI的對映關係),使用複雜名稱空間的XML轉換結果可能與預期不完全一致。
工具君

閒話 ― 為什麼XML與JSON之間沒有唯一的"標準答案"

與CSV轉JSON那種簡單的"一行對應一個物件"不同,XML與JSON之間並不存在唯一公認的轉換規則。XML中屬性、文本節點、子元素可以同時存在於一個元素裡,而JSON只有簡單的鍵值對,因此轉換時必須做出某種取捨。xml2json、xml-js、org.json等主流實現在如何表示屬性、文本與子元素並存時如何取捨等問題上,各自採用了不同的規則。

儘管如此,開發者仍然經常會遇到XML。基於SOAP的Web API、金融/政務/醫療行業中歷史悠久的系統間對接、RSS/Atom訂閱源、Android的佈局檔案等,都是XML至今仍作為標準格式使用的領域。將從這些遺留系統中取得的資料,接入現代化的、只認JSON的工具鏈(用jq處理,或在JavaScript中作為普通物件操作)——這樣的需求始終存在。

本工具採用的 @attributes/#text 規則,是一種常見且實用的選擇,而非大量使用特殊符號的極端記法。不帶屬性的葉子元素會直接轉換為其文本值,這樣簡單的配置值或RSS標題之類的常見場景就能得到易讀的普通JSON;而帶有屬性的元素則會被明確區分出來,只要看一眼轉換結果就能知道哪些值原本是屬性。