SS 工具箱
SS 工具箱
所有数据均在本地处理

XML 转 JSON 转换器:SOAP 报文、接口数据与标签属性

在浏览器里把 SOAP 响应或 XML 接口报文读成 JSON,也能把 JSON 对象写回标签和属性。compact 映射规则固定,但单个子元素和多个同名子元素得到的 JSON 结构不同,混排文本的顺序也不会保留。

这个 XML ↔ JSON 转换器的行为

  1. 标签变键名,属性收进 _attributes

    每个元素按标签名映射成键。<user id="7">Ann</user> 会变成 { user: { _attributes: { id: "7" }, _text: "Ann" } },属性和文本不会与子标签混在一起。

  2. 一个子元素是对象,两个就变数组

    单个 <item> 保持对象,两个同名 <item> 变成 JSON 数组。接口从两条数据变成一条时结构会改变,客户端代码要同时兼容两种形态。

  3. 声明、注释和 CDATA 各有专用键

    _declaration、_doctype、_comment、_cdata 与根元素同级出现。CDATA 按原始文本读取,转回 XML 时这四类内容都会写回。

  4. 文本会保留,位置不会

    compact 模式下子元素两侧的文本会合并成一个 _text 数组:<r>before<a>1</a>after</r> 变成 _text: ["before", "after"],写回时得到 beforeafter<a>1</a>。需要无损往返时,请使用只含元素的内容。

  5. 命名空间和特殊字符都会处理

    xmlns / xmlns:p 作为普通属性保留,文本里的 <、&、> 输出时转义、读取时还原。文件和转换都在本地完成,不会上传。

XML ↔ JSON 转换常见问题

为什么只返回一条数据时 JSON 结构变了?

因为转换器使用 xml-js 的 compact 模式:同名子元素重复出现才合并成数组,单个子元素仍然是对象。两条 <item> 是 item: [...],一条是 item: {...}。客户端读取字段前先统一成数组。

属性和元素文本怎么表示?

属性进 _attributes,文本进 _text,例如 <user id="7">Ann</user> → { user: { _attributes: { id: "7" }, _text: "Ann" } }。文本始终是字符串,<n>42</n> 也不例外;空元素会变成 {}。

顶层 JSON 数组能转成 XML 吗?

不能。JSON 根必须是单个对象,数组根会生成 <0><r>a</r></0><1><r>b</r></1> 这种非法标签名。请把数组包进一个根对象,例如 { "items": { "item": [...] } }。

声明、注释、CDATA 和 DOCTYPE 会保留吗?

会,分别用 _declaration、_comment、_cdata、_doctype 这些专用键。读取时 _comment 会带上两侧空格(如 " hi ");转回 XML 会写回 <?xml ...?>、<!--hi-->、<![CDATA[...]]> 和 <!DOCTYPE r>。

文本和子元素混排会怎样?

compact 模式把文本片段收进 _text 数组,位置信息会丢失。<r>before<a>1</a>after</r> 变成 { r: { _text: ["before", "after"], a: { _text: "1" } } },写回得到 <r>beforeafter<a>1</a></r>。保留顺序需要非 compact 模式,本页固定使用 compact。

命名空间和特殊字符怎么处理?

命名空间声明作为普通属性保留(xmlns、xmlns:p),带前缀的标签在键里保留前缀(p:a)。文本输出时转义 <、&、>,读取时还原实体;属性值只转义引号,属性里直接写 < 或 & 仍可能产生非法 XML。

会出现哪些报错?数据会上传吗?

多根节点报 Text data outside of root node,闭合标签不匹配报 Unmatched closing tag,根是标量报 The JSON structure is invalid;对应输入框变红,不会写出部分结果。全部在浏览器本地执行,文件不会上传。

相关工具
赞助MindElixir