XML 与 JSON 互转

按一套固定规则在两个方向之间转换:数组包一层同名节点,属性加 @ 前缀,类型用 type 属性标注。同一份数据转过去再转回来,结构保持一致。

粘贴 JSON 后会自动转换0 字符 · 0 字节

转换规则

JSON 转 XML 时,对象的每个键变成一个同名子节点;数组默认包在键名对应的节点里,每项叫 item,比如 { "tags": ["a", "b"] } 会写成 <tags><item>a</item><item>b</item></tags>。 如果顺手想少一层,可以换成「重复同名标签」,同一个名字写两遍,反向解析时同名兄弟节点会自动合并成数组。

反过来的那一步对称:某一层只有一种同名子节点、名字又正好等于数组项名时,会直接收成数组, 所以上面那段 XML 会原样变回 { "tags": ["a", "b"] },不会多出一层 item。 数组项名可以在上面改,不想收就把开关关掉。

XML 的属性没有对应的 JSON 写法,这里统一加 @ 前缀: <site name="x"> 会变成 { "@name": "x" }。 节点里既有属性又有文字时,文字放在 #text 上。前缀可以在上面改,改成 $ 或 - 都行。

XML 只有文本,没有类型。想保住数字和布尔,勾上「标注数字、布尔和 null」,会写成 <count type="number">3</count>,反向解析时按标注还原。 不标注的话,打开「按内容推测类型」也能把 3、true 猜回来, 但 007 这类带前导零的会老老实实留成字符串,不会偷偷变成 7。

做不到的部分

两种格式的表达能力本来就不一样,下面这些情况只能近似:空数组和空对象都会写成 <k/>,回不来了;只有一项的数组,写出来和「键名恰好叫 item 的单个对象」完全一样, 解析时按数组处理;属性顺序、注释、命名空间前缀、DTD 和 CDATA 在转 JSON 时会丢掉; 一个节点里文字和子节点混排(也就是混合内容)只按「文字进 #text」处理,顺序信息不保留。

还有节点名:JSON 的键名可能是中文、带空格或以下划线开头。中文可以直接当 XML 节点名,空格和 / 这类符号会被换成下划线,开头是数字的会补一个下划线,万一撞名就只能自己改回来。

拿不准就先来回转一遍

上面有个「结果作为输入并换方向」的按钮,转过去再转回来,对自己的数据能不能无损往返心里就有数了。 改配置格式这种一次性任务,先确认往返一致,再动线上文件,比直接改完再回滚省事得多。