JSON 与 XML 互转

JSON 与 XML 双向互转:数组展开为重复标签,属性解析成带前缀的键。

老系统的接口、SOAP 报文和部分行业标准至今仍在用 XML,改造成 JSON 时最容易卡在结构不对齐上:XML 靠同名标签重复来表达列表,JSON 靠数组,两边互转时单元素列表和单值对象长得一模一样,属性又无处安放。这里用固定前缀保留属性、用重复标签表达数组,规则明确且可预期。

转换使用 fast-xml-parser,在浏览器本地执行,报文内容不会上传,涉及内部系统的接口样例可以放心粘贴。它只做元素与属性的结构映射,不做 DTD 或 XSD 校验,也不保留注释和 CDATA,所以适合配置文件与简单报文;带格式细节的文件在转换前建议留一份原始备份。

数组怎么表达

XML 没有数组类型,只能靠同名标签重复出现来表达。JSON 转 XML 时,根对象会被包一层 root 节点,数组属性按属性名重复展开,例如列表字段会生成多个并列的同名标签;根节点本身是数组时,会用 root 包裹重复的 item 标签。这带来一个结构上的取舍:单元素数组和单值对象生成的 XML 完全一样,反向解析时无法判断该还原成数组还是对象,因此只能按「同名标签出现多次就合并成数组」的规则处理,单元素数组会退化成标量。

属性与文本的表示

XML 转 JSON 时,属性会被解析成带固定前缀的键,属性值保持字符串不做类型推断;元素在没有子元素时,其文本直接作为值,同名标签重复出现会自动合并成数组。有两点需要留意:标签文本默认会按内容推断类型,编号写成 007 会被解析成数字 7 而丢掉前导零,true 会变成布尔值;另外注释、CDATA 包裹和命名空间声明都不会被保留,转换只处理元素、属性和文本。

适用边界

这种互转适合配置文件、简单接口报文和日志片段,不适合带 DTD、XSD 校验或需要保留格式细节的场景。SOAP 报文和带命名空间的交换需求要特别注意:标签前缀会被当成普通名字的一部分,生成类似带冒号的键名,语义上不再有命名空间概念。转换器不做格式校验,结构错误的 XML 会直接抛错;要保证语义完整,建议一次只转一层结构,或直接按目标系统的 schema 手工写映射。

广告

常见问题

数组转成 XML 后为什么看不出来是数组?
因为 XML 只有重复标签这一种表达方式,没有数组类型标记。单元素数组生成的 XML 与单个对象完全相同,反向解析时无法区分,只能约定同名标签多次出现即数组。需要严格还原类型时,应在 JSON 侧固定包装形式,让数组始终有容器标签。
属性为什么带前缀,值为什么都是字符串?
前缀是转换器区分属性和子元素的约定,用于避免属性和同名子元素撞键,解析时可以按这个前缀把属性取回来。属性值不做类型推断、统一保持字符串,是为了避免版本号 1.0、编号 007 这类值被改写成数字而丢信息。
XML 里的注释和 CDATA 会保留吗?
不会。转换只处理元素、属性和元素文本,注释、CDATA 包裹、文档声明和命名空间声明都会被丢弃,也不会校验 DTD 或 XSD。如果原始文件里有必须保留的注释或特殊节点,转成 JSON 再转回去一定会丢,这类文件不建议走互转。
生成的 XML 根节点名字可以改吗?
根节点名固定为 root,根是数组时内部元素标签固定为 item,页面没有改名入口。需要指定根节点名或其他标签名,可以在生成结果里直接替换,或者先在 JSON 侧包一层以目标名命名的键再转换,这样生成的标签名就是你要的名字。

相关工具

广告