JSON转XML转换器

在浏览器本地把 JSON 递归转换成格式良好的 XML:对象变成带子元素的节点,数组变成重复的 item 元素,字符串与数字保持原值,特殊字符自动转义或包进 CDATA。打开页面已填好一份示例与它的转换结果,根元素是 root、共 10 个元素、最大深度 2 层。

示例为 5 个顶层键、含一个数组与一个嵌套对象,可直接改。
根元素root
元素总数10
最大深度2 层
XML 字符数201

使用方法

  1. 文本框里已经放好一份示例 JSON(5 个顶层键,含数组与嵌套对象),下方输出区是它转换出的 XML,八张结果卡也以这份示例算好。
  2. 在输入区里按 Ctrl + Enter(macOS 用 Cmd + Enter)立即重算;Enter 留给换行。左侧输入是 JSON,右侧输出是 XML,二者同步更新。
  3. 点「转换为 XML」手动触发;点「载入示例」恢复默认;点「复制 XML」把结果复制到剪贴板;点「清空」两头都清空。
  4. 看结果卡:根元素名(默认 root)、元素总数、最大嵌套深度、XML 字符数。深度与元素数能帮你判断这份结构是否适合直接落进 XML。
  5. 若 JSON 不合法(少逗号、引号不配对、尾随逗号),工具会拦下来并在结果区给出具体的中文报错,不会静默输出半截 XML。

JSON转XML转换器能解决什么

一是把松散的 JSON 落进强结构的 XML。很多老系统、SOAP 接口、Android 资源与配置文件只认 XML,前端或脚本拿到的是 JSON,中间就需要一把转换钥匙。这个 JSON转XML转换器把键变标签、把值变文本,让两份数据在没有任何后端参与的情况下完成互转。

二是自动处理数组与嵌套。JSON 的数组在 XML 里没有原生命名,最稳妥的做法是重复同一个元素名(本页用 item)。嵌套对象则递归展开成子节点,深度随结构自动增长。示例里 tags 数组被展开成两个 <item>,author 对象被展开成 nick 与 age 两个子节点。

三是把特殊字符挡在合法边界内。XML 里 < > & " 都要转义,否则会破坏文档结构。本页对元素文本内容做转义;如果字符串里含换行或 <,则自动包进 <![CDATA[ ... ]]>,既保真又合法。这样产出的 XML 可以直接喂给解析器,不会因为一个 & 而报错。

四是给出结构体检指标。元素总数、最大深度、字符数三张卡,让你在转换前就预判这份 XML 会不会过大、嵌得太深。示例只有 10 个元素、2 层深,属于轻量结构;真正复杂的配置可能上百元素、十层深,那时就该考虑是否要精简。

本页不做这些事:不把 XML 再转回 JSON(那是另一个工具的方向),不按 XSD 校验结构合法性,不保留 JSON 里的顺序无关性之外的类型信息(XML 里数字和字符串都成了文本,类型需要双方约定)。要校验 XML 合法性请用专门的 XML 校验器。

原理和变量:转换的六个内核

① 用的规则。递归下降:遇到对象 → 生成 <键名>…子节点…</键名>;遇到数组 → 生成 <键名><item>…</item>…</键名>;遇到字符串/数字/布尔 → 生成 <键名>值</键名>;遇到 null → 输出带 xsi:nil="true" 的空元素。整个转换就是一遍深度优先遍历,输出用两个空格缩进。

② 关键参数:元素名怎样从键来。JSON 的键可以含空格、中文、连字符甚至点号,但 XML 的元素名只允许字母、数字、下划线、连字符与句点,且不能以数字开头。本页把非法字符统一替换成下划线(例如键 user-name 保留,键 2nd 变成 _nd)。这一条是 JSON转XML转换器最容易踩的坑,因为键名直接当了标签名。

③ 遵循的标准。输出是标准 XML 1.0 文本,根节点固定为 root(可理解为文档根),声明用 <?xml version="1.0" encoding="UTF-8"?>。转义规则遵循 XML 实体定义(& → &amp;,< → &lt;,> → &gt;,引号 → &quot;),文本含 < 或换行时改用 CDATA,符合 W3C 对良构 XML 的要求。

④ 输入怎么变成输出。设 JSON 值 V、当前元素名 N、当前深度 d:若 V 是对象,就为每个键递归(d+1);若 V 是数组,就为每个元素递归生成 item(d+1);若 V 是标量,就输出 <N>V</N>。示例 {"name":"柳泉工具"} → <name>柳泉工具</name>;["calc","seo"] 在 tags 下展开成两个 <item>。遍历同时累加元素计数与最大深度。

⑤ 边界与阈值。JSON 必须是可解析的对象或数组,顶层是裸字符串或数字会被拒绝(XML 需要根元素包裹);空对象 {} 输出空根节点,空数组 [] 同样输出空根节点,两者都合法。解析失败(如尾随逗号、引号不配对)会捕获异常并给出中文原因,不输出半成品。文本里若出现 XML 不允许的控制字符,会被剔除后再转义。

⑥ 常见误用。第一是把键名直接当标签名却忘了清洗,带空格的键会产出非法 XML。第二是数组用「带索引的元素名」而非统一 item,导致下游按名字取值时错位。第三是忽略类型信息:XML 里 <year>2026</year> 只是文本,对方解析时要自己知道这是数字。第四是中文键被替换成下划线后和别的键撞名,需要在约定层避免。

完整示例(数值仅作演示)

示例输入与页面默认值完全一致,是一份含数组与嵌套对象的 JSON。转换后:

再看几个边界对照:null 值 → <x xsi:nil="true"/>(空元素,标明无值);含 < 的字符串如 "a<b" → 包进 <![CDATA[a<b]]>,避免把 <b 误当成标签;含 & 的字符串如 "x&y" → 转义成 x&amp;y。这三类处理保证了无论输入多刁钻,输出始终是良构 XML。

输入范围与对照表

下表列出常见 JSON 片段对应的 XML 形态,用来确认转换口径:

JSON 片段XML 形态
"name":"柳泉工具"<name>柳泉工具</name>
"year":2026<year>2026</year>
"tags":["a","b"]<tags><item>a</item><item>b</item></tags>
"author":{...}<author><nick>...</nick></author>
"x":null<x xsi:nil="true"/>
"t":"a<b"<t><![CDATA[a<b]]></t>

把表里的规则连起来看:标量是最简单的「键当标签、值当文本」;数组是「键当父标签、每个元素当 item」;对象与 null 则是递归与空元素的两种特例。整张表覆盖了 JSON 全部六种值类型,照此即可预判任意输入的产出。

结果边界和舍入

常见问题

为什么数组会变成一堆 item 元素?

因为 XML 没有「数组」这个原生结构,只有一层层的元素。把数组展开成重复的 <item> 是最通用的写法:下游按 parent/item 取,就能拿到全部成员,且顺序与 JSON 一致。若你希望用带索引的名字(如 item_0),那属于私有约定,本页不默认这么做,以免和别的解析器冲突。

键名里有空格或中文,转换后怎么处理?

中文本身在 XML 元素名里是不允许的(XML 1.0 元素名不允许非 ASCII 起始),空格、点号等同样非法。本页把这些都替换成下划线,例如 user name 变成 user_name、2nd 变成 _nd。所以写入 JSON 时最好只用字母、数字、下划线、连字符,避免转换后语义丢失。

字符串里的小于号和与号会破坏 XML 吗?

不会,本页做了处理。普通文本里的 & 会转义成 &amp;,< 转义成 &lt;;如果字符串里同时含换行或 <,则整段包进 <![CDATA[ ... ]]>,让里面的特殊字符原样保留又不破坏结构。这正是 JSON转XML转换器保证「输出一定是良构 XML」的关键。

null 值转换出来是什么样?

输出一个空元素并标注 xsi:nil="true",形如 <x xsi:nil="true"/>。这是 XML 表达「有这个字段但无值」的标准做法,比直接省略元素更明确,下游能区分「字段不存在」和「字段为空」。

转换后数字还会是数字类型吗?

不会。XML 里所有内容都是文本,<year>2026</year> 只是字符序列「2026」。对方解析时要按约定把它当整数读;如果你需要强类型,通常在 XML 外用 schema 或约定文档说明,本页不在标签里写类型信息。

为什么我的 JSON 报「解析失败」?

最常见是尾随逗号(如 { "a":1, })、键没加双引号、或字符串用了单引号。JSON 要求键和字符串都必须双引号、不能有尾随逗号。本页捕获解析异常后把原因写进结果区,例如「Unexpected token }」,你照着改掉那一行即可重新转换。

这能把 XML 再转回 JSON 吗?

不能,本页是单向的 JSON 转 XML。XML 转回 JSON 要处理属性、命名空间、混合内容等额外结构,是另一个方向,需要专门的 XML 解析与约定。如果你只是想校验或美化 JSON,请用 JSON 校验/格式化工具。

输入的 JSON 会被上传吗?

不会。整个解析与拼接都在当前页面完成,没有任何网络请求,也不写浏览器存储;刷新页面输入即恢复成示例。你可以打开开发者工具的 Network 面板自行确认,修改输入时不会出现新请求。

相关工具