← 全部工具

JSON 转 XML 转换器

在浏览器中即时将 JSON 与 XML 互相转换。仅本地运行且私密,并附属性、数组、命名空间和注意事项的说明。

JSON 与 XML 互转:面向两个数据世界的实用转换工具

大多数开发者不管愿不愿意,都得同时和 XML 与 JSON 打交道。现代 Web API 几乎清一色地使用 JSON,但只要你一接触银行、保险公司、政府接口、企业 ERP 或老旧的 SOAP 服务,XML 就又冒了出来。本页面上的 JSON 转 XML 工具能直接在你的浏览器中把 JSON 转成 XML,再把 XML 转回 JSON,让你无需把敏感载荷复制到远程服务,就能在这两种格式之间穿梭。

深靛蓝背景上发光的嵌套 JSON 大括号正变形为一棵带尖括号的 XML 标签树
JSON 对象和 XML 标签树以不同的形态描述同一份数据。

XML 和 JSON 究竟是什么

XML(可扩展标记语言)是一种围绕嵌套标签、属性和命名空间构建的标记格式。它的设计初衷是用于文档和结构化数据交换,并携带了大量机制:模式(XSD)、命名空间、处理指令、注释、CDATA 区段,以及顶部的一份正式声明。正是这份丰富性使得 XML 至今仍主导着遗留系统和企业系统。你会在 SOAP Web 服务、RSS 和 Atom 订阅源、配置文件(Spring、Maven、.NET 应用配置)、办公文档格式,以及 SWIFT 和 ISO 20022 等金融报文标准中见到它 — 银行和保险公司每天仍在用 XML 交换数据。

JSON(JavaScript 对象表示法)则简单得多:带键值对的对象、数组、字符串、数字、布尔值和 null。它几乎能一对一地映射到几乎每种编程语言的数据结构上,这正是它接管现代 Web API、REST 接口、移动应用以及 package.json 这类配置文件的原因。JSON 通常比等价的 XML 小 30 到 50 个百分点,解析速度也明显更快,部分原因在于它省去了让 XML 显得冗长的闭合标签和属性机制。

对转换至关重要的关键差异

这两种格式的重叠之处足以让它们相互映射,但并不干净。少数几处结构性差异几乎制造了所有的摩擦:

  • 属性还是子节点。XML 会区分 <user id="1">(一个属性)和 <user><id>1</id></user>(一个子元素)。JSON 没有这种概念,所以转换工具会自己发明一个。按惯例,属性会被折叠进一个诸如 @attributes 的键中,或加上 @ 前缀,而元素文本则落入一个像 #text 这样的键里。
  • 数组。JSON 有原生数组,XML 则没有。XML 中的列表只不过是同一个标签的重复,比如连续三个 <item> 元素。转换工具必须推断:何时应当把重复的同级元素塌缩成一个 JSON 数组,何时又该让单个元素保持为一个普通对象。
  • 命名空间。XML 用命名空间(xmlns:soap 这类前缀)来避免跨模式的名称冲突。JSON 没有任何对应物,所以这些前缀要么作为字面字符留在键里,要么被剥除。
  • 冗长度与元数据。XML 可以通过属性把元数据附加到节点上;JSON 则把一切都表达为键和值。这使 JSON 更紧凑、更易读,而 XML 则通过 XSD 模式保留了校验能力。

需要留意的转换陷阱

把 JSON 转成 XML 再转回 JSON 并指望得到完全相同的结果,是经典的错误。除非你掌控规则,否则这种转换在两个方向上都是有损的。请记住以下几点:

  • 属性会被搞乱。当你把 JSON 转成 XML 时,工具需要一条规则来决定哪些键变成属性、哪些变成元素。反方向转换时,属性必须落到某个地方,而这个"某处"(@ 前缀、@attributes 块)在不同的库之间各不相同。如果下游解析器期望的是另一种约定,那么即便什么都没丢失,数据看起来也会不对。
  • 单个元素还是数组。一个只含一个 <item> 的 XML 订阅源会产生一个 JSON 对象;含有两项的同一订阅源则会产生一个 JSON 数组。假定结果是数组的代码会在单项的情形下崩溃。这是 RSS 和 SOAP 解析错误的一个常见来源。
  • 命名空间泄漏或消失。取决于所用工具,soap:Body 可能会变成一个字面命名为 soap:Body 的键,也可能前缀被完全丢弃,从而改变文档的含义。
  • 混合内容与类型。XML 把一切都当作文本,所以像 true42 这样的值在转成 JSON 后可能仍是字符串,而反方向则没有给注释或 CDATA 留下原生的容身之处。
两棵结构化数据树由青色和金色光构成的抽象标记节点架桥相连
在格式之间映射意味着要决定属性、数组和命名空间如何转换。

为什么本地转换很重要

JSON 和 XML 载荷往往是开发者经手的最敏感的东西:带令牌的 API 响应、带账号的 SOAP 报文、带凭据的配置文件。一款在你浏览器中运行的转换工具绝不会上传其中任何内容。解析和序列化都在你的机器上进行,没有任何内容被发送到服务器,而且页面加载完成后你可以离线使用该工具。对于调试生产数据或任何处于合规约束下的事务,这就是一次安全的快速检查与一次意外数据泄露之间的区别。

如果你需要事后整理结果,请把它与我们其他的 数据转换工具 搭配使用,或在把输出交给流水线中的下一个工具之前,用 JSON 格式化工具 把它整理干净。

常见问题

转换工具会把我的 JSON 或 XML 上传到任何地方吗?

不会。JSON 转 XML 和 XML 转 JSON 的转换都完全在你的浏览器中运行。你的数据永远不会离开你的设备,而且页面加载后该工具可离线工作。

转成 JSON 时 XML 属性是如何处理的?

由于 JSON 没有原生的属性概念,XML 属性会被放进一个专用的键中,通常加上一个 at 符号前缀,或被归到一个属性块下。元素的文本内容会被单独存储,因此两者都能在转换中保留下来。

为什么我的单个 XML 元素变成了对象而不是数组?

XML 没有原生数组,所以列表只是一个重复的标签。当只有一个元素时,转换工具无法把它与一个普通对象区分开,于是它就变成了对象。两个或更多同名标签的同级元素则会塌缩成一个 JSON 数组。

像 soap 或 xmlns 这样的 XML 命名空间会怎样?

JSON 没有与 XML 命名空间对等的东西。取决于转换方式,前缀会作为字面文本保留在键内,或被剥除。如果你的下游消费方依赖命名空间前缀,请检查输出。

我能把 JSON 转回 XML 并得到原始文档吗?

不总是能完全一致。转换在两个方向上都是有损的,因为注释、CDATA 以及属性与元素之分这类 XML 特性,在 JSON 中没有干净的对应物。当你掌控两边的命名规则时,往返转换效果最好。

与 JSON 相比,XML 如今还用在哪里?

XML 存在于遗留系统和企业系统中:SOAP Web 服务、RSS 和 Atom 订阅源、配置文件,以及 SWIFT 和 ISO 20022 等金融报文。JSON 则主导着现代 Web API、REST 接口和移动应用。