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 却看着像个单值,因此接收端的代码写成同时应付一个与多个,才最稳妥。
使用方法
- 贴入 XML SOAP 响应也好,RSS 源也好,都可原样贴入。
- 查看转换结果 **属性归于 `@attributes` 键下,文本归于 `#text`。**
- 对照结构 与原本的 XML 并排,可确认哪个元素落到了哪个键下。
- 复制或下载 可直接贴进代码,也可存为文件。
用好本工具的小技巧
- 带有属性的元素会被归入 `@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 中它成为最外层的键。
常见问题
闲话 ― 为什么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;而带有属性的元素则会被明确区分出来,只要看一眼转换结果就能知道哪些值原本是属性。