JSON ↔ XML 互转
JSON在 JSON 与 XML 之间互转。嵌套对象会被包裹在可配置的根元素下。
本页内容
什么是 JSON 与 XML 转换器?#
JSON 和 XML 是两种写结构化数据的方式,它们在语法层面并不通用——一个用花括号和方括号,另一个用尖括号标签。两者之间的转换并不是”压缩”或”编码”,而是把同一棵值树用另一种记法重新表达,好让只懂 XML 的系统能消费以 JSON 送来的数据,反之亦然。
这个映射大体上是机械的,但有两个出名的坎。第一,XML 强制要求唯一一个根元素把所有内容包起来,而 JSON 完全允许顶层就是个裸对象或裸数组——所以从 JSON 转 XML 时,总得给外层包装取个名字。第二,XML 元素可以带属性(<a id="7">),JSON 里没有对应物;通行做法是把属性收纳到 @ 前缀的键下,而与属性共存的文本则放进 #text 键。
本页在浏览器里双向转换:JSON 转 XML(把你给的值包在一个由你命名的根元素下),以及 XML 转 JSON(把属性摊到 @ 键下,并默认剥掉外层根元素,让你直接拿到里面的内容)。
怎么使用#
- 用工具栏左上角的 JSON → XML / XML → JSON 开关选好方向。
- 在左侧 输入 框里输入或粘贴。
- JSON → XML 需要合法 JSON。任意顶层值都会被包到根元素之下。
- XML → JSON 需要格式良好的 XML 文档。最外层那一个元素会被自动剥掉,让你拿到它内部的 JSON。
- 在 JSON → XML 模式下,设置 根元素(Root element)字段(默认
root)来给包装标签命名——比如user、feed、response。XML 强制单一根,所以这个名字总是必填。 - 右侧 输出 框实时显示结果,点 复制(Copy)取走。
- 点 示例(Sample)载入一份与当前方向匹配的小文档;点 清空(Clear)重置两边。
主要特性#
- 一个工具两个方向。 一个开关在 JSON 转 XML 和 XML 转 JSON 之间切换,输入框自动重新对齐。
- 可配置的根元素。 因为 XML 离不开单一外层元素,由你来命名;转换器替你完成对任意 JSON 顶层形状的包装。
- 规范的 XML 声明。 JSON 转 XML 的输出以标准
<?xml version="1.0" encoding="UTF-8"?>序言开头,并按两空格缩进美化。 - 属性完整往返。 XML 转 JSON 时,元素属性保留在
@前缀的键下,与属性并排的文本收纳在#text下,不会悄悄丢失。 - 带数字感知的解析。 XML 全是文本;解析器会把看起来像数字的元素值还原成 JSON 数字(所以
<age>36</age>变成36,而不是"36")。
实例演示#
JSON → XML#
方向选 JSON → XML、根元素命名为 root,点 示例:
{
"name": "Ada",
"age": 36,
"skills": ["math", "logic"]
}
转换器把所有内容包到 <root> 下,并按 XML 的需要展开数组——每个元素变成一个同名的独立标签:
<?xml version="1.0" encoding="UTF-8"?>
<root>
<name>Ada</name>
<age>36</age>
<skills>math</skills>
<skills>logic</skills>
</root>
把 根元素 字段改成 person,外层就变成 <person> / </person>,内部结构原封不动。
XML → JSON#
切到 XML → JSON,点 示例:
<?xml version="1.0"?>
<root><name>Ada</name><age>36</age></root>
外层 <root> 被剥掉,内部元素变成 JSON 属性,36 被识别为数字:
{
"name": "Ada",
"age": 36
}
属性也会保留。像 <a id="7">label</a> 这样的元素会产出 { "@id": "7", "#text": "label" }——属性挂在 @id 下,文本挂在 #text 下,两边都不丢。
常见问题#
为什么我的 JSON 数组变成了重复的 XML 元素,而不是一个里面套着多项的包装?#
这正是 XML 表示列表的方式:它没有”数组”这种构造,每个条目只能各自做一个同名元素。JSON 里挂在 skills 键下的数组 ["math", "logic"] 因此变成两个并列的 <skills> 元素,而不是一个 <skills> 里再套子项。这是标准且对 schema 友好的映射——XML 消费方就是这么期待的。
XML 转 JSON 时,我的外层元素去哪了?#
转换器自动剥掉了那唯一的根。XML 强制顶层只能有一个元素,但在 JSON 里这个包装通常是多余的——<root><name>Ada</name></root> 的 root 不携带 JSON 需要的任何信息。剥掉它让你直接拿到有意义的内部值。如果你确实要保留根,把它当作普通元素、按名字访问即可。
输出里的 36 为什么是数字而不是字符串?#
XML 没有独立的数字类型——标签之间的内容全是文本。解析器会做数字识别,所以文本看起来像数字的元素(36、3.14)会作为 JSON 数字返回。这对常见数据很方便,但有个副作用:像 <code>007</code> 这种商品代码会丢掉前导零——把这类值放进属性里,或者接受它作为字符串。
任何 XML 文档都能转吗?#
格式良好的 XML 都可以,包括标签里的命名空间、属性、自闭合元素和声明。它不会解析 DTD、不会按 schema 校验、也不会拉取外部实体——处理全程本地、纯文本,这也意味着你可以放心粘贴并不完全信任的文档。