XML转JSON数组只有一个元素 解决单节点转JSON变成对象的Bug

2次阅读

xmljson时单节点默认被解析为对象而非数组,需通过explicitArray或arraytags等配置强制转为数组,并统一处理空值与嵌套层级以避免下游代码异常。

XML转JSON数组只有一个元素 解决单节点转JSON变成对象的Bug

XML转json时单节点被误转成对象而非数组

遇到 xml2json 或类似库把只有一个 <item></item> 的 XML 转成 {item: {...}} 而不是 {item: [{...}]},本质是多数解析器默认按“出现次数动态推断类型”——单次出现就当对象,多次才建数组。这不是 bug,是设计选择,但业务上常要统一结构。

arrayNotationalwaysArray 强制转为数组

主流 XML-to-JSON 库(如 xml2jsfast-xml-parser)都提供显式配置项来覆盖默认行为:

  • xml2js:在 Parser 选项中设 explicitArray: true(默认 false),所有标签无论数量都生成数组
  • fast-xml-parser:用 ignoreAttributes: false + arrayMode: "strict" 或直接传 arrayTags: ["item", "entry"]
  • 手写转换逻辑时,别依赖 Array.isArray(node.item) 做判断——先统一包装: Array.isArray(node.item) ? node.item : [node.item]

后处理 JSON 时小心嵌套层级和空值

强制转数组只是第一步,后续代码容易因假设“一定是数组”出错:

  • 如果原始 XML 中 <item></item> 根本不存在,node.itemundefined[node.item] 会变成 [undefined],而非空数组 []
  • 多层嵌套时(如 <root><list><item>...</item></list></root>),需对 node.list.item 做同样处理,不能只扫顶层
  • 某些库(如旧版 xml-parser)的 explicitArray 对属性(@attr)无效,仍需单独判断

测试边界 case 比写转换逻辑还重要

真实 XML 数据波动大,光测“一个 item”不够:

  • XML 中 <items></items>(自闭合空标签)→ 解析后可能是 {items: NULL}{items: {}},不是 {items: []}
  • <items></items>(空开始+结束标签)→ 多数库转成 {items: ""},需额外 trim + 判空
  • 同名标签混在不同层级(<a><b><c></c></b><c></c></a>)→ cb 下是单个,在 a 下是多个,强制数组可能破坏语义

真正麻烦的从来不是怎么转,而是怎么让下游代码不因“有时是对象、有时是数组”而反复加防御性判断。留个心眼:只要上游 XML 结构有不确定性,就别信任何自动推断。

text=ZqhQzanResources