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

XML转JSON时单节点被误转成对象而非数组
遇到 xml2json 或类似库把只有一个 <item></item> 的 XML 转成 {item: {...}} 而不是 {item: [{...}]},本质是多数解析器默认按“出现次数动态推断类型”——单次出现就当对象,多次才建数组。这不是 bug,是设计选择,但业务上常要统一结构。
用 arrayNotation 或 alwaysArray 强制转为数组
主流 XML-to-JSON 库(如 xml2js、fast-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.item是undefined,[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>)→c在b下是单个,在a下是多个,强制数组可能破坏语义
真正麻烦的从来不是怎么转,而是怎么让下游代码不因“有时是对象、有时是数组”而反复加防御性判断。留个心眼:只要上游 XML 结构有不确定性,就别信任何自动推断。










