使用方法
- 文本框里已经放好一份示例 JSON(5 个顶层键,含数组与嵌套对象),下方输出区是它转换出的 XML,八张结果卡也以这份示例算好。
- 在输入区里按 Ctrl + Enter(macOS 用 Cmd + Enter)立即重算;Enter 留给换行。左侧输入是 JSON,右侧输出是 XML,二者同步更新。
- 点「转换为 XML」手动触发;点「载入示例」恢复默认;点「复制 XML」把结果复制到剪贴板;点「清空」两头都清空。
- 看结果卡:根元素名(默认 root)、元素总数、最大嵌套深度、XML 字符数。深度与元素数能帮你判断这份结构是否适合直接落进 XML。
- 若 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 实体定义(& → &,< → <,> → >,引号 → "),文本含 < 或换行时改用 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。转换后:
- 根元素为 root,共 10 个元素(root、name、year、active、tags、两个 item、author、nick、age);
- 最大嵌套深度 2 层(root → author → nick 为 2 层;root → tags → item 也是 2 层);
- XML 字符数 201(含声明与缩进);
tags数组展开为<item>calc</item>与<item>seo</item>两个并列元素;author对象展开为<nick>liu</nick>与<age>3</age>两个子节点。
再看几个边界对照:null 值 → <x xsi:nil="true"/>(空元素,标明无值);含 < 的字符串如 "a<b" → 包进 <![CDATA[a<b]]>,避免把 <b 误当成标签;含 & 的字符串如 "x&y" → 转义成 x&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 全部六种值类型,照此即可预判任意输入的产出。
结果边界和舍入
- 顶层必须是对象或数组。裸字符串、数字、布尔、null 没有根元素可包裹,会被拒绝并提示「请用一个对象或数组作为根」。
- 键名清洗不可逆。含非法字符的键被替换成下划线后,原键里的空格、点号信息就丢了。若下游要精确还原,需要双方事先约定键名只用合法字符。
- 类型信息在 XML 里不保留。数字
2026、布尔true在 XML 中都是纯文本,对方解析时要按约定自行转换类型,本页不写任何类型注解。 - 深度与元素数只做统计、不截断。结构再深、元素再多都照常转换;若结果过大,请参考结果卡的数值自行精简,本页不会替你悄悄截断。
- 控制字符被剔除。XML 1.0 不允许某些控制字符(如 0x00~0x08),这些字符在转义前会被移除,避免产出非法文档。
- 全部计算在浏览器本地完成。输入不上传,刷新即清空,没有网络请求,也没有服务端参与。
常见问题
为什么数组会变成一堆 item 元素?
因为 XML 没有「数组」这个原生结构,只有一层层的元素。把数组展开成重复的 <item> 是最通用的写法:下游按 parent/item 取,就能拿到全部成员,且顺序与 JSON 一致。若你希望用带索引的名字(如 item_0),那属于私有约定,本页不默认这么做,以免和别的解析器冲突。
键名里有空格或中文,转换后怎么处理?
中文本身在 XML 元素名里是不允许的(XML 1.0 元素名不允许非 ASCII 起始),空格、点号等同样非法。本页把这些都替换成下划线,例如 user name 变成 user_name、2nd 变成 _nd。所以写入 JSON 时最好只用字母、数字、下划线、连字符,避免转换后语义丢失。
字符串里的小于号和与号会破坏 XML 吗?
不会,本页做了处理。普通文本里的 & 会转义成 &,< 转义成 <;如果字符串里同时含换行或 <,则整段包进 <![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 面板自行确认,修改输入时不会出现新请求。
相关工具
- HtaccessRedirect生成器:写服务器重定向规则,和本页同属开发者向的配置生成。
- Markdown转HTML转换器:另一种结构化文本互转,思路与本页的递归下降一致。
- TOML转JSON转换器:把另一种配置格式转成 JSON,可作为本页的前置环节。
- IP转二进制转换器:把 IP 拆成比特,和本页一样专注数据形态转换。
- 字符串长度统计:转换前后核对字符数,配合本页的「XML 字符数」卡片使用。
- Robots.txt生成器:生成站点级配置文件,和 XML 输出一样是给机器读的声明。
- 环境变量转JSON转换器:把 KEY=VALUE 行转成 JSON 对象,再交给本页转 XML 很顺手。