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 卻看著像個單值,因此接收端的程式寫成同時應付一個與多個,才最穩妥。
使用方法
- 貼入 XML SOAP 回應也好,RSS 來源也好,都可原樣貼入。
-
查看轉換結果
屬性歸於
@attributes鍵下,文字歸於#text。 - 對照結構 與原本的 XML 並排,可確認哪個元素落到了哪個鍵下。
- 複製或下載 可直接貼進程式,也可存為檔案。
用好本工具的小技巧
- 帶有屬性的元素會被歸入
@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個元素的陣列;只有一個時則保持為普通物件。<a>...</a><b>...</b> 這樣在頂層並列多個元素也會導致轉換失敗。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;而帶有屬性的元素則會被明確區分出來,只要看一眼轉換結果就能知道哪些值原本是屬性。