极简工具箱

免费在线工具 · 本地计算 · 无需上传

XML 与 JSON 怎么互转:属性、文本节点与数组的映射

老系统还在吐 XML,新接口全用 JSON,中间总要转一道。但 XML 有属性、有命名空间、有无序的重复节点,这些 JSON 都没有,转换必然要做取舍。

广告位(百度联盟)

一、两种数据模型的差异

XML 是树 + 属性 + 文本,同一个标签可以重复出现表示列表;JSON 是对象 + 数组,重复靠数组表达,属性只能变成键。所以转换的核心是给「属性」和「文本」找位置。

二、常见映射约定

业界比较通用的约定(如 xml2js 的默认行为)是:

<user id="7" vip="true">
  <name>张三</name>
  <tags><tag>a</tag><tag>b</tag></tags>
</user>
{
  "user": {
    "@id": "7",
    "@vip": "true",
    "name": "张三",
    "tags": { "tag": ["a", "b"] }
  }
}

规则总结:

三、单元素歧义怎么处理

<tag>a</tag> 转出来是 {"tag":"a"} 还是 {"tag":["a"]}?取决于约定,而消费方往往写死了其中一种。稳妥做法:

  1. 转换时显式开启「同名即数组」选项(xml2js 的 explicitArray: true),让所有元素都是数组,消费方不用判断类型。
  2. 或者在 schema 里声明哪些路径是列表,转换时强制成数组。

不做这一步,代码里就会充满 Array.isArray(x) ? x : [x] 这种补丁。

四、会丢失的信息

如果 XML 要用于签名、报文校验,不建议转 JSON 再转回来——往返一次信息就可能不完整。要么全程用 XML 处理,要么只做单向转换。

五、实际转换的注意点

六、工具选择

小段报文可以直接贴进 JSON 格式化校验 检查转换结果是否合法;如果 XML 里带大量实体,用 HTML 实体编解码 单独看转义结果更直观。转换逻辑本身建议写在代码里(Python 的 xmltodict、JS 的 fast-xml-parser),在线工具只用于快速验证。

小结

属性加 @、文本用 #text、重复元素转数组;单元素是否成数组必须提前约定;命名空间和 CDATA 在转换中容易丢,涉及签名校验时不要往返转换。

本文相关工具(本地计算,无需上传)

更多使用教程