JSON 格式化 / 压缩 / 校验JSON 转义 / 去转义JSON 对比JSON 键排序JSON 转字符串 / 字符串转 JSONJSON 转 XMLXML 转 JSONJSON 数组转 CSVCSV 转 JSON 数组JSON 与 YAML 互转JSON 生成代码定义查询参数与 JSON 互转Cookie 与 JSON 互转JSON 与 Properties 互转
JSON 转 XML
把 JSON 对象转换成结构对应的 XML
JSON 转 XML:结构怎么对应,哪些信息一定会丢
两种数据模型的不同之处
JSON 有三个 XML 没有的东西:数组(有序的同类型集合)、明确的类型(数字就是数字、布尔就是布尔)、以及没有属性与文本的区别(只有键值对)。
XML 有两个 JSON 没有的东西:属性(附着在元素上的元数据)、以及混合内容(一个元素里既有子元素又有文本)。
这意味着转换不可能完全无损。任何一个方向的转换都必须做取舍,取舍的方式没有统一标准——这正是同一个 JSON 用不同工具转出的 XML 长得不一样的原因。
常见对应规则
| JSON | XML | 说明 |
|---|---|---|
| 顶层对象 | 一个根元素 | 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 里没有对应物,通常是丢掉。
工具怎么用
- 把 JSON 粘进左侧输入框。
- 在根节点名输入框里填根元素的名字(默认
root)——目标系统对根元素名有要求时必须改,否则对方解析不了。 - 点转换,输出在右侧。
输出会对文本内容做 XML 转义(&、<、>),所以内容里带这些符号不会破坏结构。如果是给正式系统用,务必拿目标系统的 XSD 或真实样例校验一遍——上面的取舍点(数组形态、null 的表示、类型还原)没有标准答案,只能与对端对齐。
常见问题
XML 属性怎么表示?
本工具把 JSON 的键统一生成为子元素,不区分属性。如果必须属性,请先用别的方式处理。
为什么数组没有下标?
XML 靠重复标签表达列表,没有下标概念。还原时连续同名兄弟元素会被当作数组。