JSON 转 XML
JSON 转 XML 是把 JSON 文本转成 XML 文档的免费在线工具。粘贴 JSON 或拖入 .json 文件,即可在浏览器本地转出 XML 并复制、下载:普通键转成元素、@_ 开头的键转成属性、#text 键转成元素文本、数组转成同名重复元素,规则固定可预期。XML 只能有一个根元素,所以当 JSON 顶层是数组、标量或多个键时,会自动包一层根元素(名字可改,数组项的元素名也能改)。缩进 2/4 空格与单行压缩可选,< > & 会自动转义,中文和 emoji 不乱码。含空格或以数字开头的键不是合法的 XML 名称,可以选择自动修正。也能反向把 XML 转回 JSON。全程文件不上传、无需注册,手机电脑都能用。
🔒 内容在你的浏览器内转换,未上传任何服务器,也不解析外部实体(防 XXE)。
如何使用JSON 转 XML
粘贴 JSON 文本,或把 .json 文件拖入上方区域(浏览器本地处理、不上传,含密钥的接口报文也放心)。
按需设置根元素名、数组项元素名、缩进(2 / 4 空格)或压缩单行、是否输出 <?xml?> 声明头、是否自动修正非法键名,结果实时刷新。
在下方预览 XML(含字节数与根元素名),点「复制」或「下载 XML」保存为 .xml 文件。
关于JSON 转 XML的常见问题
- json 转 xml 会把文件上传到服务器吗?
- 不会。json 转 xml 全程在你的浏览器本地完成,JSON 内容不会上传到任何服务器,关闭页面即清除,处理含密码、密钥、Token 的接口报文也放心。
- 手机上能把 json 转成 xml 吗?
- 可以。本工具是纯网页实现,手机、平板、电脑浏览器打开即用,无需安装 App,也无需注册登录,json 转 xml 的结果可以直接复制或下载成 .xml 文件。
- json 转 xml 在线工具免费吗?要注册吗?
- 免费,也不用注册。json 转 xml 全部由你本机的浏览器完成,没有服务器转换成本,因此不限次数、不加水印、不要求登录,复制结果和下载 .xml 文件同样免费。
- json 转 xml 中文会不会乱码?
- 不会。json 转 xml 输出的是 UTF-8 文本,中文键名、中文值和 emoji 都原样保留,不会被转成 \uXXXX 或数字实体;声明头默认写的就是 encoding="UTF-8"。如果你的老系统读 .xml 文件必须带 BOM,可以勾选「下载文件带 UTF-8 BOM」。
- json 数组转 xml 之后是什么结构?
- XML 只允许一个根元素,而顶层数组会产生多个并列元素,所以 json 数组转 xml 时会先包一层根:[1,2] 转成 <root><item>1</item><item>2</item></root>,其中 item 就是「数组项元素名」,可以改成 user、record 等更有语义的名字。嵌套位置的数组不需要包裹,直接转成同名重复元素,比如 {"a":{"b":[1,2]}} 转成 <a><b>1</b><b>2</b></a>。
- json 转 xml 的根元素名怎么改?
- 在「根元素名」里填即可,默认 root。要注意它只在需要包裹时才生效:当 JSON 顶层就是单个键(例如 {"config":{...}})时,这个键本身已经是合法单根,工具会直接用 config 当根元素,不会再套一层;顶层是数组、标量或多个键时才会用到你填的名字,结果区也会提示「已自动包裹」。
- 为什么 json 转 xml 提示键名无法作为元素名?
- 因为 JSON 键的取值范围比 XML 元素名宽松:含空格的 "user name"、以数字开头的 "2024"、含 < > 的 "a>b" 都是合法 JSON 键,却都不是合法的 XML 名称。默认保真优先,遇到这类键会直接报错而不是偷偷改写你的数据;勾选「自动修正键名」后会把非法字符换成下划线、数字开头前面补一个下划线,并提示修正了几个。修正后键名与原 JSON 不再一致,且 "a b" 与 "a_b" 这类会撞成同一个名字,后出现的覆盖先出现的。
- json 转 xml 之后还能再转回 json 吗?
- 可以,页面上方切到「XML → JSON」即可,属性和文本能原样往返。但有两类信息不可逆:一是数组长度为 1 的信息,{"a":[1]} 与 {"a":1} 转出的 XML 完全相同,转回来会得到后者;二是类型信息,XML 里一切皆文本,1 和 "1"、true 和 "true" 转出后无法区分,转回 JSON 默认按字符串还原。
- json 转 xml 支持多大的文件?
- 可以粘贴文本,也可以拖入 .json 文件,单次输入按 UTF-8 字节计上限 100MB,超出会提示「输入过大」并建议拆分。超过 30 万字符时会自动关闭实时转换、改成点「转换」按钮再跑,避免在手机上卡住页面;几千行的接口报文基本是瞬时完成。
什么情况需要把 json 转成 xml
判断标准只有一条:接收方的协议或模板写死了 XML,才需要转;数据只在自己系统里流转,继续用 JSON 更省事。下面五类场合最常见,各自有不同的写法要求。
- SOAP / WebService 老接口
- 银行、运营商、政务系统的接口大多只收 SOAP 报文,请求体必须是 XML。命名空间在 JSON 里写成属性键即可,例如 {"soap:Envelope":{"@_xmlns:soap":"http://schemas.xmlsoap.org/soap/envelope/"}},会原样输出成 xmlns:soap="…";但 Envelope / Body 骨架要你自己在 JSON 里写全,工具不会替你补。
- pom.xml、web.xml、Android layout 等配置
- Maven、Spring、Android 这类配置只认 XML。它们层级深、键名固定,转完建议用 2 空格缩进再粘进 IDE;压缩单行虽然体积小,但提交后 diff 几乎没法看,代码评审会很痛苦。
- RSS / Atom 订阅源、sitemap.xml
- 这三种都有规范写死的根元素(rss、feed、urlset),所以要把「根元素名」改成规范要求的那个,别留默认的 root。多条内容在 JSON 里写成数组,转出来正好是 item、entry、url 这类重复元素。
- 导入老 ERP / 财务系统的 XML 模板
- 这类系统通常只给一份 XML 导入模板。照模板结构写 JSON(属性用 @_ 前缀、元素自身文本用 #text),转完对着模板核一遍元素名——XML 元素名区分大小写,Item 和 item 是两个不同的标签,JSON 那边不会提示你写错。
- 这些情况不用转
- 前后端接口、日志、NoSQL 存储这类自己能定协议的场景,用 JSON 就行。XML 的价值在 XSD 校验、命名空间和属性语义,用不上这三样时转过去只会把体积撑大:{"users":[{"id":"1","name":"张三"},{"id":"2","name":"李四"}]} 是 65 字节,转成压缩单行的 XML 后 101 字节,多了约 55%,标签名越长差得越多。
json 转 xml 的键怎么变成元素、属性和文本
映射规则是写死的、可预期的,与本站「XML 转 JSON」严格互逆,所以同一份数据来回转不会跑偏。下面这张表就是全部规则。
| JSON 里的写法 | 转出的 XML | 说明 |
|---|---|---|
"port": "8080" | <port>8080</port> | 普通键转成子元素,值转成元素文本 |
"@_id": "1" | <a id="1"/> | @_ 开头的键转成当前元素的属性,前缀本身不输出 |
"#text": "文本" | <a id="1">文本</a> | #text 键转成元素自身的文本,用于「既有属性又有文本」的元素 |
"b": [1, 2] | <b>1</b><b>2</b> | 数组转成同名重复元素,XML 没有数组类型,这是通行写法 |
"empty": null | <empty/> | null 与空对象都转成自闭合空元素,不写成 <empty></empty> |
"note": "1 < 2 & 3" | <note>1 < 2 & 3</note> | < > & " ' 自动实体转义,不会产出坏 XML |
"标题": "小鹿工具" | <标题>小鹿工具</标题> | 中文键名是合法 XML 名,中文与 emoji 原样 UTF-8 输出 |
json 转 xml 什么时候会自动包一层根元素
XML 规定有且只有一个根元素,而 JSON 顶层可以是对象、数组、字符串、数字甚至 null。两边不对等,所以顶层不是「单个键」时必须包一层。下表把六种顶层形态和对应结果列全,结果区也会用黄条提示是否包裹过。
| JSON 顶层 | 处理 | 转出的 XML |
|---|---|---|
{"a": {"b": 1}} | 已是合法单根,不包裹 | <a><b>1</b></a> |
{"a": 1, "b": 2} | 多个键 → 包 root | <root><a>1</a><b>2</b></root> |
[1, 2] | 数组 → 包 root,每项落 item | <root><item>1</item><item>2</item></root> |
"hi" | 标量 → 包 root | <root>hi</root> |
{"a": [1, 2]} | 单键但值是数组 → 包 root | <root><a>1</a><a>2</a></root> |
{"@_x": "1"} | 单键是属性或 #text 键 → 包 root | <root x="1"/> |
json 转 xml 有哪些内容转不过去
转不过去的主要有三类:XML 名称规则比 JSON 键严格、XML 没有数组和类型概念、以及在 JSON 解析阶段就已经损失的数字精度。下面几条建议转换前先看一眼。
- 含空格或数字开头的键
- "user name"、"2024"、"a>b" 是合法 JSON 键但不是合法 XML 元素名。默认直接报错不改数据;开启「自动修正键名」后会改成 user_name、_2024、a_b,并提示修正数量。注意 "a b" 与 "a_b" 会撞成同一个名字,后写入的覆盖先写入的,工具不会自动加编号。
- 数组长度信息
- {"a":[1]} 与 {"a":1} 转出的 XML 完全一样(都是一个 <a>),转回 JSON 只能得到后者。这是 XML 没有数组类型的固有限制,不是转换错误。
- 类型信息
- XML 里一切皆文本,数字 1、字符串 "1"、布尔 true 与字符串 "true" 转出后长得一样。反向转回 JSON 时本站默认全部按字符串还原(保真优先),需要数字/布尔可在 XML 转 JSON 页勾选「推断类型」。
- 大整数精度
- 超出 JavaScript 安全整数范围(9007199254740991)的整数,比如 19 位的雪花 ID,在 JSON.parse 那一步就已丢精度。工具检测到会给黄色提示,但不会伪造精度,建议在 JSON 里就把这类 ID 写成字符串。另外 1.0 解析后是 1,转出的 XML 会写成 1。
- DTD、XSD 与命名空间声明
- 工具只输出数据本身,不会生成 DTD、XSD 或自动补 xmlns。需要命名空间时,在 JSON 里写成属性键即可,例如 {"root":{"@_xmlns":"http://example.com"}}。
- JSONC / JSON5 / JSON Lines
- 带 // 注释、尾逗号、单引号的「类 JSON」,以及每行一个 JSON 对象的 JSON Lines 都会报格式错误。前者请先删掉注释和尾逗号,后者请先用方括号包成一个数组再转。
反过来用「XML 转 JSON」时也有一条对称的损失:原 XML 里的注释、<?xml?> 声明、处理指令和 CDATA 包裹标记在转成 JSON 后就没有了,再转回来不会自动还原,改数据时留一份原始文件更稳妥。