XML 与 JSON 互转
XML 转 JSON、JSON 转 XML,双向可调
输入
转换结果
解析成功不代表内容安全:把来源不明的 XML 渲染到页面上必须转义。
命名空间前缀会原样保留(如 ns:root),不会展开成 URI。
最后更新:2026-10-11
工具介绍
XML 与 JSON 表达的是同一种树形结构,但映射细节很多:属性(attribute)放进 JSON 时怎么表示?只有文本没有子节点的元素该是一个字符串还是一个对象?同名元素出现多次要不要变成数组?这些选择没有唯一正确答案,取决于你的用途,所以本工具把它们都做成可调选项,并在页面上说明每种选择的影响。解析出语法错误时会给出精确的**行号与列号**,而不是笼统地说「格式错误」。同时会明确提示:解析成功不等于内容安全,把不可信来源的 XML 转成 JSON 再渲染到页面上仍需转义。
功能特性
双向转换
XML 转 JSON 与 JSON 转 XML 都支持,可以互相验证:转过去再转回来应当还原成原结构。
错误定位到行列
语法错误会指出具体在第几行第几列,而不是只报「解析失败」,让排查直接可落地。
属性前缀可调
默认把属性映射成 @ 前缀的键(如 @id),也可以改成 - 或自定义前缀,或干脆丢弃属性。
文本键可调
当元素同时有属性和子节点时,它的文本放哪个键可以设定,默认是 #text。
强制数组
指定哪些元素名总是转成数组,即使只出现一次 —— 避免程序里处理「有时是对象有时是数组」的麻烦。
实体安全处理
只展开 5 个内置实体(amp/lt/gt/quot/apos)与数字引用;自定义实体原样保留并列出,不解析 DOCTYPE 里的 ENTITY 定义,从根上避免实体展开攻击。
怎么用
- 1
选择方向
XML → JSON 或 JSON → XML。
- 2
粘贴内容
把 XML 或 JSON 粘进输入框,结果会随选项实时更新。
- 3
调整映射选项
按需要设置属性前缀、文本键、强制数组等,观察输出变化。
- 4
复制或下载
复制结果文本,JSON 方向还可以格式化后下载。
参数说明
- 方向
- XML 转 JSON,或 JSON 转 XML。
- 属性前缀
- 把 XML 属性映射成 JSON 键时加的前缀,默认 @。
- 文本键
- 混合内容里文本内容对应的键名,默认 #text。
- 强制数组
- 逗号分隔的元素名列表,这些名字总是输出为数组。
- 根节点名
- JSON 转 XML 时的根元素名。JSON 没有根概念,必须指定一个。
- 条目名
- 数组元素对应的 XML 标签名,默认 item。
适用场景
- 把接口返回的 XML 转成 JSON 便于用程序处理
- 检查一个 XML 文件的结构是否正确、层级有多深
- 把 JSON 配置转成某个系统要求的 XML 格式
- 通过往返转换验证两种表示是否等价
- 排查一个格式错误的 XML 具体错在哪一行
常见问题
关于这个工具,你可能会问
属性在 JSON 里为什么带 @ 前缀?
因为 JSON 的对象键没有「属性」这个概念,而 XML 的属性(attribute)与子元素(child element)是两种不同的东西,需要区分开。用 @id 表示属性、用 id 表示子元素是最常见的约定,不依赖任何非标准扩展就行。如果你对接的系统用的是别的约定(比如 - 前缀),可以在选项里改;如果属性是纯元数据、不需要保留,也可以选择丢弃。
为什么 <中文> 报错了?
因为 XML 规范里 NameStartChar 的字符集并不包含中文等非 ASCII 字符,所以中文标签名在严格意义上就是非法的。这一点用 Python 的 xml.etree 验证过,它会报 not well-formed (invalid token)。本工具早期版本曾经放行过这类名字,后来改成严格拒绝 —— 因为一个比权威实现更宽松的解析器更危险:它会让你以为自己的 XML 是合法的,等换到别的系统上才报错。如果你的数据确实含中文标签,那它可能不是标准 XML(比如是某种自定义格式),需要先做转换。
为什么有的元素转成了字符串,有的转成了对象?
因为 Element 的两种形态需要不同表示。一个元素如果既没有属性也没有子元素,内容就只有一段文本,这时直接输出字符串最简洁(如 <name>Tom</name> → "Tom")。如果它带了属性或子元素,就需要一个对象来容纳多个键。这个行为由「折叠纯文本」选项控制,关掉它则统一输出成对象形式,便于对结构做统一处理。
同一个标签出现多次会怎样?
默认会自动转成数组,因为这是唯一不丢信息的做法。但如果某个元素在你的数据里逻辑上就是单个,而某次恰好出现了两个(可能是数据问题),自动数组会让下游代码措手不及。所以本工具还提供「强制数组」选项:把元素名写进去,它无论出现几次都是数组,下游就不必写「有时是对象有时是数组」这种兼容分支。
XML 里的注释会被保留吗?
转换时会忽略注释。因为 JSON 没有注释这种语法,无处安放;而且注释往往是给人看的说明,在数据转换里保留下来反而会污染结构。如果你需要保留注释做文本对比,那是另一个场景,应该用文本对比工具而不是格式转换。
自定义实体为什么不展开?
因为展开自定义实体意味着要解析 DOCTYPE 里的 ENTITY 声明,而这是 XML 外部实体攻击(XXE)的经典入口 —— 攻击者可以借此读取服务器本地文件。本工具只处理 5 个语言内置实体和数字字符引用,遇到无法识别的实体会**原样保留**并单独列出来告诉你,而不是静默丢弃或尝试展开。这样既安全,也不会让你在不知情的情况下丢数据。
往返转换能完全还原吗?
在结构层面可以:XML 转成 JSON 再转回 XML,元素层级、属性、文本都会还原。但有两类信息无法保留:一是注释,二是元素间无意义的缩进空白(否则每个有格式的文档都会多出一堆空的 #text 节点)。所以往返结果的语义等价,但字节不一定逐字相同。如果你需要逐字节对比,请用文本对比工具。
命名空间会怎么处理?
前缀会原样保留,例如 <ns:root xmlns:ns="urn:x"> 转成 JSON 后键名就是 ns:root。这与 Python 的 etree 不同 —— 它会展开成 {urn:x}root。这里的选择是刻意的:工具箱的用户通常只是想看看 XML 的结构,而展开后的 URI 前缀又长又难读,反而妨碍理解。这个差异在页面上有说明,如果你需要严谨的命名空间展开结果,应该用专门的编程库。