JSON轉XML轉換器
將JSON資料轉換為XML。@attributes還原為元素屬性,#text還原為文本內容,陣列還原為同名的兄弟元素——是XML轉JSON工具的逆過程,全部在瀏覽器中完成。
JSON 轉 XML 的約定
JSON 與 XML 都用來描述結構化資料,但能表達的東西並不完全相同。XML 有「屬性」與「文字內容」這兩個 JSON 裡並不存在的概念,所以直接轉換時總會遇到兩個問題:屬性該怎麼表示,同名元素組成的陣列又該怎麼還原。本工具採用被廣泛使用的約定,把 @attributes 對應為元素屬性,把 #text 對應為文字內容,把陣列還原成同名的兄弟元素。
例如 {"book": {"@attributes": {"id": "1"}, "#text": "標題"}} 會變成 <book id="1">標題</book>,而 {"items": {"item": [1, 2]}} 會變成在 <items> 中包含 <item>1</item> 和 <item>2</item> 兩個兄弟元素的 XML(XML 只能有一個根元素,因此陣列需要用父元素包起來)。文字內容中的 & < > 會自動跳脫為實體參照,屬性值還會額外跳脫 ",因此值裡帶標點符號也不會產生損壞的 XML。所有處理都在瀏覽器中完成。
把 JSON 轉換成 XML 的步驟
-
貼上 JSON
輸入想轉換的 JSON。XML 只能有一個根元素,因此頂層必須是以根元素名為唯一鍵的物件(陣列請用父元素包起來,例如
{"items": {"item": [...]}})。 -
把要作為屬性的內容放進 @attributes
希望輸出為元素屬性的鍵,請集中放在
@attributes物件裡。 -
把文字內容放進 #text
當一個元素既要有屬性又要有本文時,把本文的值放在
#text底下。 - 確認結果並複製 會產生帶縮排的 XML,可以直接貼到設定檔或 API 請求中。
用好本工具的小技巧
- 在
@attributes鍵中放入一個物件,該物件的每個屬性都會成為轉換後元素的屬性。 #text鍵用於表示與屬性或子元素共存的元素的文本內容。不含屬性的簡單元素直接用字串作為值即可。- 給同一個鍵賦予陣列,陣列的每個元素都會作為同名的兄弟元素重複輸出。
- 值為
null時會生成不含屬性、文本、子元素的空自閉合標籤(<tag/>)。 - 本工具假定輸入格式為姊妹工具"XML轉JSON轉換器"的輸出格式(以根元素名為鍵的物件,頂層僅有一個鍵)。
這些情境會用到
傳送給只接受 XML 的 API
手邊的資料是 JSON,但接收方要求 XML 時可以轉換。與老舊業務系統介接時經常遇到。
遷移設定檔格式
把用 JSON 寫的設定移到以 XML 為基礎的工具時,可以當作初稿使用。
用 JSON 來思考 XML 結構
手寫層級很深的 XML 相當費力,先用 JSON 組好再轉換會清楚得多。
確認約定本身
實際試試 @attributes 與 #text 如何呈現,可以在自行撰寫轉換程式時作為規格的參考。
JSON 轉 XML 的術語
- 屬性(attribute)
<book id="1">中id="1"的部分。JSON 沒有對應的概念,因此本工具用@attributes這個特殊鍵來表示。- 文字內容(#text)
<book>標題</book>中本文的部分。當元素需要同時帶有屬性與本文時使用#text。- 實體參照(跳脫)
- 把
&改寫成&之類的處理。必須先轉換&,否則新產生的<裡的&會被二次跳脫。 - 同名兄弟元素
- XML 透過重複同名標籤來表示清單,JSON 陣列會還原成這種形式。
- 根元素
- XML 最頂層必須只有一個元素。當 JSON 頂層含有多個鍵時,這一點需要留意。
常見問題
@attributes 的鍵中的物件,其每個屬性都會變成轉換後XML元素的屬性。例如 {"@attributes": {"category": "fiction"}} 會轉換為 category="fiction" 屬性。"book": [{"title": "A"}, {"title": "B"}] 會轉換為包含兩個 <book> 標籤的XML。@attributes、#text、陣列和null)。不遵循此規則的自由格式JSON(例如充滿數字和布林值的普通API響應)可能無法轉換為預期的XML結構。
閒話 ― 將JSON"還原"為XML時需要注意的地方
XML轉JSON的過程近似於"資訊壓縮"。XML可以同時容納屬性、文本、子元素三種資訊,而JSON只有簡單的鍵值對應關係,因此轉換時必須採用某種規則(本工具採用 @attributes/#text/陣列/null 這四條規則)。只要遵循該規則,將JSON"還原"為XML就是一個機械且唯一確定的過程;但如果強行將不遵循此規則的自由格式JSON轉換為XML,就可能分不清哪些應該是屬性、哪些應該是元素,導致結果與預期不符。
在實際工作中,有時需要先將舊版XML API的響應轉換為JSON以便在JavaScript中處理,處理完後再轉換回XML傳送給其他系統——例如將SOAP格式API的響應轉為JSON處理後,再作為SOAP格式的請求傳送回去。在這種往返轉換中,保持轉換規則的一致性至關重要,如果中途混入採用不同規則的工具,屬性與文本之間的對應關係就可能被打亂。
本工具嚴格要求"頂層只能有一個鍵",這反映了XML規範本身的要求(文件必須只有一個根元素)。如果需要轉換含有多個頂層鍵的JSON,可以先用一個公共父鍵(例如 root)將其包裹起來再輸入本工具,即可輸出為具有單一根元素的XML。