XML转JSON转换器

将XML数据转换为JSON。可以把老旧的XML API响应、SOAP报文或RSS/Atom订阅源转换为JSON——属性归入@attributes、文本归入#text、重复元素变为数组——全部在浏览器中完成。

把 XML 转成 JSON

有时您想用惯用的 JSON 形状,来看一眼老旧的 XML 接口、SOAP 往来,或是 RSS/Atom 源的内容。本工具会把贴入的 XML 转换过来,并在浏览器内部把整件事做完,贴入的东西不会被送往任何地方。

**之所以需要一套约定,正因为 XML 与 JSON 持有数据的方式根本不同。** XML 区分属性与文本,且允许同名元素出现任意多次,这两样 JSON 都没有。于是属性被放进 `@attributes`,元素直接持有的字符串放进 `#text`,重复出现的元素则化为数组。**躲不开的是:当可重复的元素恰好只出现一次时,歧义便随之而来。** 在原本的 XML 里它仍是「可重复之物的一次」,到了 JSON 却看着像个单值,因此接收端的代码写成同时应付一个与多个,才最稳妥。

使用方法

  1. 贴入 XML SOAP 响应也好,RSS 源也好,都可原样贴入。
  2. 查看转换结果 **属性归于 `@attributes` 键下,文本归于 `#text`。**
  3. 对照结构 与原本的 XML 并排,可确认哪个元素落到了哪个键下。
  4. 复制或下载 可直接贴进代码,也可存为文件。

用好本工具的小技巧

  • 带有属性的元素会被归入 `@attributes` 对象中,与元素本身的文本或子元素分开存放。
  • 当一个元素同时包含属性与子元素或文本时,文本部分会存入 `#text` 键,不会与属性值混淆。
  • 同名的兄弟元素多次出现时会自动合并为数组:3个 `` 标签会变成含3个元素的数组,只有1个时则保持为普通对象。
  • 不含属性、文本、子元素的空元素(例如 ``)会被转换为 `null`。
  • `xmlns` 等命名空间前缀不会被拆分,元素仍以 `ns:tag` 这样的完整名称作为键。

这些场景会用到

把 XML 接口接进只吃 JSON 的代码

接收的一方只认 JSON 时,可先把转换后的形状定下来。

解析 RSS 或 Atom 源

把源里的条目变成 JSON,用脚本照原样跑起来便容易多了。

读懂 SOAP 响应的内容

**SOAP 因嵌套与命名空间而难读,一旦把层级摊成 JSON 便好跟多了。**

为测试准备夹具

可由真实的 XML 响应推出一份 JSON 模拟数据。

转换约定的术语

@attributes
**收纳 XML 元素属性的键。** 因 JSON 并无属性这一概念,故给它们另辟一键。
#text
收纳元素直接持有的字符串的键。当一个元素既有属性又有子元素时,它便成了必需。
重复元素
以同一名称出现不止一次的元素。**在 JSON 中化为数组,但只出现一次时会呈现为单值,而非只含一项的数组。**
命名空间前缀
`soap:Body` 中的 `soap:` 部分。在 JSON 中它作为键名的一部分原样留存。
混合内容
文本与子元素同处一个元素之内。**JSON 并无与之对应的结构,这里也最容易在转换中丢失信息。**
根元素
位于 XML 最顶端的唯一元素。在 JSON 中它成为最外层的键。

常见问题

每个元素的属性会被归入 `@attributes` 键下的对象中。例如 `` 会转换为 `{"@attributes": {"category": "fiction"}, ...}`,与元素本身的值(文本或子元素)分开存放,不会混淆。

当同一父元素下存在多个同名的兄弟元素时,会自动合并为数组。例如存在两个 `` 标签,转换后 `book` 键的值就是一个含2个元素的数组;只有一个时则保持为普通对象。

最常见的原因是结束标签缺失或名称不匹配(闭合标签与开始标签名称不同)。此外XML要求只能有一个根元素,如果像 `......` 这样在顶层并列多个元素也会导致转换失败。

本工具仅支持XML转JSON这一个方向。如果需要单独格式化或校验JSON、XML,请使用本站的其他格式化工具。

命名空间前缀不会被拆分,元素仍以 `ns:tag` 这样的形式作为键名。由于不会解析命名空间(即前缀与URI的映射关系),使用复杂命名空间的XML转换结果可能与预期不完全一致。
工具君

闲话 ― 为什么XML与JSON之间没有唯一的"标准答案"

与CSV转JSON那种简单的"一行对应一个对象"不同,XML与JSON之间并不存在唯一公认的转换规则。XML中属性、文本节点、子元素可以同时存在于一个元素里,而JSON只有简单的键值对,因此转换时必须做出某种取舍。xml2json、xml-js、org.json等主流实现在如何表示属性、文本与子元素并存时如何取舍等问题上,各自采用了不同的规则。

尽管如此,开发者仍然经常会遇到XML。基于SOAP的Web API、金融/政务/医疗行业中历史悠久的系统间对接、RSS/Atom订阅源、Android的布局文件等,都是XML至今仍作为标准格式使用的领域。将从这些遗留系统中取得的数据,接入现代化的、只认JSON的工具链(用jq处理,或在JavaScript中作为普通对象操作)——这样的需求始终存在。

本工具采用的 `@attributes`/`#text` 规则,是一种常见且实用的选择,而非大量使用特殊符号的极端记法。不带属性的叶子元素会直接转换为其文本值,这样简单的配置值或RSS标题之类的常见场景就能得到易读的普通JSON;而带有属性的元素则会被明确区分出来,只要看一眼转换结果就能知道哪些值原本是属性。