JSON 转 XML

把 JSON 对象转换成结构对应的 XML

JSON 转 XML:结构怎么对应,哪些信息一定会丢

两种数据模型的不同之处

JSON 有三个 XML 没有的东西:数组(有序的同类型集合)、明确的类型(数字就是数字、布尔就是布尔)、以及没有属性与文本的区别(只有键值对)。

XML 有两个 JSON 没有的东西:属性(附着在元素上的元数据)、以及混合内容(一个元素里既有子元素又有文本)。

这意味着转换不可能完全无损。任何一个方向的转换都必须做取舍,取舍的方式没有统一标准——这正是同一个 JSON 用不同工具转出的 XML 长得不一样的原因。

常见对应规则

JSONXML说明
顶层对象一个根元素XML 只允许一个根,所以需要指定根节点名
对象一个元素,每个键成为子元素键名直接做标签名
数组同名的重复子元素这是最常见的一对多映射
字符串 / 数字元素的文本内容类型信息丢失,都变成文本
布尔文本 true/false可能被约定成 1/0 或 yes/no
null空元素或干脆省略该元素两种做法都常见,必须与接收方约定

一定会丢失或产生歧义的地方

  • 数字类型消失。JSON 的 18 和 "18" 是不同的值,转成 XML 后都是 <age>18</age>。反过来解析时按什么类型还原就成了纯约定问题。
  • 数组与"只有一个元素的数组"无法区分。{"item":[1]} 和 {"item":1} 会输出成完全相同的 XML。反过来解析时,接收方无法判断该还原成数组还是单值——这是 JSON↔XML 转换里最经典的坑,通常要靠事先约定的"某字段始终是数组"来解决。
  • 键名不一定合法。XML 标签名有字符限制(不能以数字开头、不能含空格等)。含这类键时要么改名,要么退化成把键名放进属性。
  • 属性不会自动生成。JSON 里没有"属性"的概念,所以转换器一般把一切都写成子元素。如果接收方的 XSD 要求某些值是属性,转换结果会直接校验失败。
  • 命名空间。XML 的命名空间在 JSON 里没有对应物,通常是丢掉。

工具怎么用

  1. 把 JSON 粘进左侧输入框。
  2. 在根节点名输入框里填根元素的名字(默认 root)——目标系统对根元素名有要求时必须改,否则对方解析不了。
  3. 点转换,输出在右侧。

输出会对文本内容做 XML 转义(&、<、>),所以内容里带这些符号不会破坏结构。如果是给正式系统用,务必拿目标系统的 XSD 或真实样例校验一遍——上面的取舍点(数组形态、null 的表示、类型还原)没有标准答案,只能与对端对齐。

常见问题

XML 属性怎么表示?

本工具把 JSON 的键统一生成为子元素,不区分属性。如果必须属性,请先用别的方式处理。

为什么数组没有下标?

XML 靠重复标签表达列表,没有下标概念。还原时连续同名兄弟元素会被当作数组。