如何把 XML 转成 JSON
- 粘贴 XML、把
.xml文件拖到编辑器中,或通过 URL 加载。JSON 会随输入实时生成。 - 调整属性前缀和文本键名,并决定是否始终使用数组、是否转换数字和布尔值,以及是否忽略命名空间前缀。
- 复制 JSON,或下载为
.json文件。
XML 与 JSON 的对应规则
| XML | JSON |
|---|---|
<name>Ada</name> | "name": "Ada" |
<price>9.90</price> | "price": 9.90——数字原样保留 |
<item id="7">Pen</item> | "item": {"@id": 7, "#text": "Pen"} |
<tag>a</tag><tag>b</tag> | "tag": ["a", "b"] |
<note/> | "note": null |
<![CDATA[a < b]]> | 文本 "a < b" |
<soap:Body>(开启忽略命名空间前缀时) | "Body" |
为什么“始终使用数组”很重要
只出现一次的元素会转换为单个值,出现两次时则会变成数组。这样一来,读取 JSON 的代码就必须同时处理这两种结构——列表有时只有一项时,这是典型的 bug 来源。勾选子元素始终使用数组,所有子元素都会转为数组:结构完全可预期,代价只是多几个方括号。
用代码把 XML 转为 JSON
- Python:
xmltodict.parse(text)(xmltodict 包) - JavaScript:
new XMLParser({ ignoreAttributes: false }).parse(text)(fast-xml-parser 包) - C#:
JsonConvert.SerializeXmlNode(doc)(Newtonsoft.Json) - 命令行:
yq -p xml -o json file.xml
常见问题
转换是无损的吗?
元素名、属性和文本都会保留,数字也会保持原有的每一位。但注释、处理指令以及子元素之间文本的位置(混合内容)无法在 JSON 中表示。
可以把 JSON 转回 XML 吗?
可以。使用我们的姊妹网站 JSON Formatter 上的 JSON 转 XML 工具即可,它采用相同的 @ 和 #text 约定。
命名空间会如何处理?
默认情况下,soap:Body 这类带前缀的名称会原样作为键名保留,xmlns 声明则作为属性出现。勾选忽略命名空间前缀后,会得到 Body 这样的简单名称,且不含这些声明。
为什么有些值是字符串而不是数字?
007 或 1,000 这样的值不是普通的十进制数字,为避免数据丢失,会保留为字符串。取消勾选转换数字和 true/false,即可让所有值都保持为字符串。