JSON 与 XML 转换工具

在浏览器中运行,不上传任何内容

把 JSON 转为 XML 或把 XML 转为 JSON,属性、重复元素和命名空间都有明确的处理规则。

Input · JSON

Output · XML

Converted XML appears here as you type.

Ready
Ln 1, Col 1

API 中的 JSON 与 XML

JSON 和 XML 都用文本描述结构化数据。JSON 有对象、数组以及数字、布尔值等带类型的值。XML 有嵌套的元素、属性和文本,除非 schema 另有规定,否则一切都是文本。SOAP Web 服务、RSS 和 Atom 订阅源,以及许多银行、支付和政府系统仍在使用 XML,所以基于 JSON 的应用经常需要做转换。

两种格式无法一一对应,因此本工具遵循一种常见且可逆的约定。元素变成键,元素的文本变成值。属性变成以 @ 开头的键,例如 @id。如果元素除了文本还有属性或子元素,文本放在 #text 中。重复出现的元素变成数组。命名空间前缀按原样保留,所以 <soap:Body> 变成 "soap:Body",声明变成 "@xmlns:soap"。

XML 没有类型,所以默认一切都保持为字符串:<zip>007</zip> 得到 "007",<id>7</id> 得到 "7"。打开 Numbers 后,完全按 JSON 数字格式书写的值以及 true 和 false 会被读成带类型的值(007 仍然是文本)。反方向转换时,根元素取自 JSON 唯一的顶层键;如果顶层有多个键,则使用 Root name。

使用方法

  1. 1在工具栏中选择 JSON → XML 或 XML → JSON。把数据粘贴到 Input 面板,或把文件拖进去,也可以按 Ctrl+O 打开文件(最大 5 MB)。
  2. 2在 Output 面板查看结果,它会随输入实时更新。输出上方的提示会说明转换中做了哪些改动,例如重命名的键或被省略的注释。
  3. 3XML → JSON 时,选择 Always arrays 可以让每个子元素都成为数组(在代码中更容易读取),选择 Numbers 可以转换数字和布尔值。JSON → XML 时,设置 Root name 以及是否以 XML 声明开头。
  4. 4如果输入无效,输出面板会给出行号和列号;按 F8 把光标移到出错位置。
  5. 5Swap(Shift+Alt+S)会把输出放回输入并反转方向,用来检查来回转换的结果。复制结果,或按 Ctrl+S 下载。

问题排查

应为 </item>,以闭合第 3 行打开的元素
标签必须按打开顺序的相反顺序闭合,名称和大小写都要一致。检查提示中提到的元素,看是缺少闭合标签还是拼写有误。
单独的 & 必须写成 &amp;
在 XML 的文本和属性中,& 表示实体的开始。和号要写成 &amp;,< 要写成 &lt;,或者把文本放进 <![CDATA[ ... ]]>。
未知实体 &nbsp;
XML 只定义了五个实体(&lt; &gt; &amp; &quot; &apos;)以及 &#160; 这样的字符引用。&nbsp; 来自 HTML,请改用 &#160;。
出现第二个根元素:XML 只能有一个
XML 文档只能有一个顶层元素。请用一个父元素把这些元素包起来。
XML 输出中的键被重命名了
XML 名称不能包含空格和大多数标点,也不能以数字开头,所以 first name 会变成 <first_name>,2fa 会变成 <_2fa>。提示中会列出每处重命名;如果 XML 必须使用其他名称,请修改 JSON 中的键。

常见问题

JSON 数组如何转换为 XML?

每一项都会变成一个以数组键命名的元素,每项重复一次:"tag": ["a", "b"] 会变成 <tag>a</tag><tag>b</tag>。顶层数组会被包在根元素里,每一项对应一个 <item>。空数组不会生成任何元素,因此转回 JSON 时无法还原;出现这种情况时提示会说明。

注释、CDATA 和处理指令会怎样处理?

CDATA 段会变成普通文本。注释和处理指令在 JSON 中没有对应位置,会被省略并给出提示。DOCTYPE 会被跳过,其中声明的实体不会展开。

混合内容怎么办,比如 `<p>Hello <b>world</b></p>`?

子元素照常变成键,周围的文本会汇总到 #text 中。JSON 无法记录文本在元素之间的位置,所以这种顺序会丢失;发生这种情况时转换器会给出提示。

转换是在服务器上完成的吗?

不是。XML 的解析和生成都在你的浏览器中完成,粘贴或打开的内容不会上传。为了刷新后不丢失,粘贴的内容会保存在当前标签页的 session storage 中,直到你清除它或关闭标签页。Copy link 会把输入放在链接的 # 之后,浏览器从不把这部分发送给服务器,但拿到链接的人都能看到内容。