ToolAct工具行动

JSON 转 XML 工具

JSON 输入
XML 输出
行数: 1字符数: 0字节数: 0
行数: 1字符数: 0字节数: 0

什么是 JSON 转 XML?

JSON 转 XML 工具会把结构化 JSON 数据转换成 XML 标记,方便在使用不同交换格式的系统之间传递信息。JSON 使用对象、数组、数字、字符串、布尔值和 null,而 XML 使用元素、属性、文本节点和命名空间,因此转换并不总是一一对应。数组命名、属性映射、空值、特殊字符和顺序都需要合理表达。这个工具适合 SOAP 相关集成、旧企业系统、数据迁移、测试 payload 和文档示例。用于生产接口时,仍应根据目标 XSD、API 契约或合作方格式进行校验,因为格式正确的 XML 不一定就是业务可接受的数据。

使用方法

如何使用

  1. 在左侧输入框粘贴或输入 JSON 数据
  2. 可选:自定义根元素名称
  3. 选择缩进大小(2 空格、4 空格或 Tab)
  4. 转换后的 XML 会显示在右侧,并带有语法高亮
  5. 点击“复制”或“下载”保存结果

转换检查

  • 转换后请检查数组、空值及类属性字段;JSON 与 XML 的数据建模方式并不完全一致。
  • 将 XML 复制到 API 请求、配置文件或测试夹具前,请选择一个稳定的根元素名称。

使用场景

为仅接受 XML 的集成转换 JSON 载荷部分旧接口、导入任务和供应商系统即使源数据是 JSON 也仍要求 XML。本转换器让你选择根元素,将重复数组值保留为重复的 item 节点,并在输出前转义 XML 敏感字符。输出可作为 SOAP 请求信封、EDI 测试数据或尚未迁移到 JSON 的合作方载荷的起点。
从结构化数据构建可读的 XML 示例利用缩进选项将嵌套的 JSON 样本转为整洁的 XML,适合用于文档、工单或契约讨论。无效或空的根元素名称会被防御性处理,避免小的命名失误导致快速实验失败。缩进后的格式也比单行压缩版更便于代码审查中的 diff 对比。
手动编辑 XML 前先测试边界情况null 值、空对象、空数组、基础类型数组和嵌套记录会各自产生不同的 XML 结构。先用转换器跑一遍样本,在粘贴到映射器、SOAP 客户端或导入模板之前看清这些选择。每次 Schema 变更后重复转换,保持 XML 与 JSON 契约同步。
有意识地将 JSON 字段映射为属性或子元素选择哪些键变成属性、哪些变成子元素,因为部分旧 Schema 将 ID 类字段视为属性而描述保持为元素。每次映射调整后重新运行,确认所需的属性顺序和命名空间前缀仍匹配预期的 XSD。记住 XML 文档中的属性顺序没有语义意义,但元素顺序可能被 XSD sequence 约束。
用合作方的 XSD 校验结果转换完成后,将 XML 喂入 xmllint --schema 或在线 XSD 校验器,捕获缺失的必填元素、类型错误和排序规则——这些是转换器本身无法强制的。格式良好的 XML 文档不等于下游合作方会接受的文档,属性与子元素的选择也会改变 XSD 认为哪些字段是必填的。反复调整 JSON 或转换规则直到校验器报绿,再确认载荷。

技术原理

JSON(RFC 8259,源自 JavaScript 对象字面量)和 XML(W3C XML 1.0,1998 年发布)都是树形序列化格式,但语法不同。JSON 有对象(键/值映射,键为字符串)、数组(有序列表)和六种标量类型(string、number、boolean、null 及结构类型)。XML 有元素(起始/结束标签对,包含文本或子元素)、属性(起始标签上的名/值对)、文本节点、注释、处理指令和 CDATA 节。转换是一种结构变换,没有标准答案——每种现有约定(BadgerFish、JSONML、SOAP/RPC 编码、OOXML 扁平 Schema、XBRL linkbase 格式)都是对同一输入的不同规则。 「属性 vs 子元素」的决策是核心歧义。JSON 的元数据仅存在于键名中,因此像 `{"id": "42", "name": "Alice", "admin": true}` 这样的 JSON 对象不会指明哪些键是「元数据」,哪些是「数据」。三种常见约定:(1) 本页面的默认方式——标量变为文本内容,嵌套属性包(仅含标量值的非数组对象)的原始 JSON 键变为带 `@` 前缀的 XML 属性(BadgerFish 约定)。(2) JSONML——每个 JSON 对象变为元素,键 'tag' 为元素名,键 'attr' 为属性映射,其余条目为子元素。(3) oData / Atom——JSON 对象变为元素,数组以内联方式用数组名包装元素。每种规则对某些下游消费者来说是正确的,对另一些来说则是错误的,这就是为什么没有任何 XML 转换器被普遍接受。 数组是第二个歧义。JSON 数组是有序列表;XML 没有原生数组类型。三种标准方案:(a) 重复子元素(本页面默认,OOXML/SOAP 约定):`[1, 2, 3]` -> `<root><item>1</item><item>2</item><item>3</item></root>`。(b) 包装在容器中:`<root><items><item>1</item>...</items></root>`。(c) 将数组编码为单个分隔字符串并记录分隔符(XML 内嵌 CSV,仅当消费者解析时使用)。每种方案适用于不同的下游 XSD;转换步骤需要知道发出哪种。 XML 元素名称必须是有效的 QName 令牌(XML 1.0 §2.3 / XML Namespaces 1.0 §3):以字母、下划线或冒号开头,后跟字母、数字、连字符、下划线、句点或冒号。JSON 允许像 '123' 或 'first name' 这样违反此规则的键——转换器必须重命名(slugify 为 first_name,加 _ 前缀)或报错。JSON 字符串内容在元素文本和属性值中也需要实体转义:`&` -> `&amp;`,`<` -> `&lt;`,`>` -> `&gt;`(旧版 XML 中仅在文本中必需,但始终安全),属性中的 `"` -> `&quot;` 和 `'` -> `&apos;`,以及超出编码范围的字符用 `&#xHHHH;` 表示。五个内置实体加上数字字符引用在 XML 中是强制的;HTML 的额外命名实体(`&nbsp;`、`&copy;`)在纯 XML 中未定义,使用时需要显式 DOCTYPE。 输出文档还需要序言和命名空间声明:首行为 `<?xml version="1.0" encoding="UTF-8"?>`,然后是 xmlns 声明。如果目标系统使用命名空间(SOAP 使用 `http://www.w3.org/2003/05/soap-envelope`,XSLT 使用 `http://www.w3.org/1999/XSL/Transform`),前缀映射作为 `xmlns:prefix="uri"` 属性添加到根元素。JSON 没有命名空间概念,因此选择哪个 URI 是项目特定的。对于空值,JSON null 通常表示为 `<key xsi:nil="true"/>`(XML Schema 约定)或 `<key></key>`(空元素约定)。转换器选择一种;正确答案取决于消费者的 XSD 验证。 对于反向转换(XML -> JSON),同样的歧义反向存在:属性在 BadgerFish 中映射为 `@attributes` 键,CDATA 映射为 `$` 或 `#text` 键,混合内容元素(文本与子元素交错)没有干净的 JSON 表示,通常作为字符串连接发出。实际转换器总是暴露「属性键」、「文本键」、「数组包装」选项——无法绕过。

  • JSON(RFC 8259)和 XML(W3C XML 1.0,1998)都是树形序列化格式;转换是结构变换,没有标准答案,因此多种约定(BadgerFish、JSONML、SOAP、OOXML)对同一输入并存。
  • 属性 vs 子元素:标量默认为文本内容;嵌套属性包对象(仅含标量值)变为带 @ 前缀的属性(BadgerFish)。JSONML 使用 'tag' / 'attr' 键。oData / Atom 使用包装元素。
  • 数组:本页面默认重复子元素(OOXML/SOAP 约定)。替代方案:包装在容器元素中,或编码为分隔字符串。JSON 的数组顺序在 XML 输出中保持不变。
  • XML 元素名规则:必须以字母、下划线或冒号开头,后跟字母/数字/连字符/下划线/句点/冒号(XML 1.0 §2.3)。JSON 键如 '123' 或 'first name' 是无效 XML 名,必须 slugify 或拒绝。
  • 实体转义:`&` -> `&amp;`,`<` -> `&lt;`,`>` -> `&gt;`,`"` -> `&quot;`,`'` -> `&apos;`,其他编码字符用 `&#xHHHH;`。5 个内置实体是强制的;HTML 额外实体如 `&nbsp;` 需要显式 DOCTYPE。
  • 文档序言:`<?xml version="1.0" encoding="UTF-8"?>` 是标准首行。根元素上的 xmlns 声明声明命名空间前缀;JSON 没有命名空间概念,由转换器按项目选择。
  • JSON null -> XML:`<key xsi:nil="true"/>`(XML Schema 约定)或 `<key></key>`(空元素)。选择必须匹配消费者的 XSD,否则验证失败。
  • 反向 XML -> JSON 存在同样歧义:CDATA 节变为 `$` 或 `#text` 键(BadgerFish),混合内容元素(文本与子元素交错)没有干净的 JSON 形式,通常连接为字符串。

示例

对象 -> 元素

{"name": "Alice"}
->
&lt;root>
  &lt;name>Alice&lt;/name>
&lt;/root>

数组 -> 元素列表

[1, 2, 3]
->
&lt;root>
  &lt;item>1&lt;/item>
  &lt;item>2&lt;/item>
  &lt;item>3&lt;/item>
&lt;/root>

嵌套结构

{"user": {"name": "Alice", "age": 25}}
->
&lt;root>
  &lt;user>
    &lt;name>Alice&lt;/name>
    &lt;age>25&lt;/age>
  &lt;/user>
&lt;/root>

常见问题

转换器如何把 JSON 映射到 XML?

每个 JSON 对象变成一个 XML 元素。对象键变为子元素名称;基本类型值变为元素文本。数组通过重复同名父元素表示。文本中的特殊字符会被转义(& → &amp;,< → &lt;)。

为什么 JSON 转 XML 不一定是无损的?

JSON 拥有显式的数字、布尔、null 类型,而 XML 只有文本。JSON 允许键中含空格或特殊字符,XML 元素名则不允许。顶层数组在 XML 中也没有直接对应。本页采用一些启发式规则(包裹元素 root、清洗非法键名等)来弥合这些差异。

数组在 XML 中如何表示?

每个数组元素都会生成一个同名兄弟元素。例如 [{a:1},{a:2}] → <items><item><a>1</a></item><item><a>2</a></item></items>。包裹方式可配置,部分页面允许显式指定单数元素名。

JSON 中的非法 XML 名字怎么办?

XML 元素名不能以数字开头,不能包含空格或特定符号。本页会把非法字符替换为下划线,或用 CDATA 包裹。结果仍是合法 XML,但往返转换不会完全一致。

JSON 的 null 与布尔值会被保留吗?

null 会变为空元素或省略元素,取决于设置。true/false 会输出文本字面量「true」或「false」。XML 没有这两类标准类型——下游解析器需自行实现类型解释。

可以添加 XML 属性吗?

JSON 中没有属性概念,所以默认所有内容都作为元素输出。部分转换器使用特殊键前缀(例如 @id)来表示属性——如果你的 XML schema 需要属性输出,请查看页面选项。

转换是在本地完成的吗?

是的。JSON 解析与 XML 生成都在你的浏览器内执行,输入不会被上传。