开发者工具·语法转换器
JSON 到 XML 转换:根元素、数组和无效标记名称
· 工作原理
json xml 数据格式
JSON 可以是一个裸数组,其键以数字开头或包含空格,而 XML 不允许。这篇文章解释了转换器必须对根、数组和名称做出的决定,以便您可以预测输出。
没有名称的数组 - 顶级 JSON 数组,必须成为单根 XML 文档,以及出现的包装元素
JSON 可以以 `[1,2]` 开头; XML 不能以两个对等文档元素开头。因此,ToolAcre 将根数组包装在选定的根名称中,并将每个成员写入重复的 `<item>` 子项。警告命名了该约定,因为源中不存在包装器和项目名称。
选择 `numbers` 会生成一个包含两个项目元素的 `<numbers>` 文档元素。转换是确定性的,但不是规范的:另一个系统可能需要 `<number>` 或包含属性的集合。故意设置根并将结果与接收者所需的 XML 合约进行比较。
XML 只需要一个根 - 为什么每次转换都会发明或要求一个根元素名称
XML 文档必须只有一个根元素。仅有一个普通顶级密钥的 JSON 对象可以直接使用该密钥。多键对象、数组、标量或 null 没有提供单个名称,因此编写者将其括在 `root` 中,除非用户提供另一个合法名称。
包装器规则在序列化之前实现并作为警告出现。它不是由模式发现的,也不声明 `<root>` 对旧服务有意义。命名包络是集成设计的一部分,而转换器仅保证其自身映射下的格式良好的结构。
数组没有 XML 等效项 - 每个项目重复一个元素,以及如何表示标量数组和数组数组
数组成为重复元素。在文档根目录中,成员在包装器下使用 `<item>` 。在对象内部,存储在 `line` 下的数组将成为重复的 `<line>` 同级数组。对象数组创建带有子字段的重复元素;嵌套数组没有域名,并继承构建器生成的通用结构。
在稍后的 XML 到 JSON 读取之后,这将失去一个数组成员和具有相同元素名称的标量之间的区别。 XML 提供出现次数,而不是独立的数组标记。如果稳定的基数很重要,则架构或应用程序映射必须提供它;通用序列化程序无法仅从 JSON 形状的元素名称来证明这一点。
不能是元素名称的键 - 以数字开头、包含空格或标点符号、或以“xml”开头的名称,以及转换器如何重命名或转义它们
大纲建议转换器可以重命名或转义非法键。 ToolAcre 明确拒绝了他们。带有空格的键、以数字或连字符开头的键或以保留字母 `xml` 开头的键会触发 `UNSUPPORTED_SHAPE` 并命名有问题的路径。静默重命名会产生 XML ,它不匹配任何商定的模式。
有效名称可以以字母、下划线或命名空间样式前缀开头,并且可以在开头后包含数字、句点、下划线、冒号和连字符。属性键仅使用 `@` 作为 JSON 约定;其余属性名称必须通过相同的检查。有意重命名源密钥或选择其他目标格式。
不能是元素名称的键将被拒绝,从不重命名或转义
数字和布尔值被序列化为元素文本,因此它们的 JSON 类型不再由 XML 声明。默认反向读取器因此返回字符串。 Null 在这里没有 XML 表示:它变成一个空元素,与空字符串无法区分,并且作者报告有多少值经历了该更改。
这意味着 `{ "a": null, "b": "" }` 可以生成两个读回相同的空元素。称该往返过程为无损是错误的。属性 `#text` 和 `#cdata` 保留转换器的结构约定,但它们不添加通用 XML 类型系统。
类型变为 XML 文本,而 null 变为承认的空元素歧义
使用 `{"order":{"@id":"A-7","customer":"Ada","line":[{"sku":"P1","qty":2},{"sku":"P2","qty":1}],"note":null}}`。单个 `order` 键成为根,`@id` 成为属性,每个行对象成为重复的 `<line>`,null 成为带有警告的空 `<note></note>`。
在禁用推理的情况下读回输出。属性 id、数量和文本值是字符串,而 line 是数组,因为它出现了两次。这演示了精确支持的逆,同时暴露了丢失的 null 和数字类型。接收顺序模式可能需要其他名称或顺序,本示例未对此进行验证。
这不包括什么 - 生成与给定 XSD 或命名空间匹配的 XML ,这需要手动编写映射
编写者不使用 XSD、分配命名空间 URI 或决定业务模式中的元素顺序。它写入 XML 声明,并且从不发出 DOCTYPE。包含名称空间前缀的键按字面意思保留,但这不是名称空间解析或前缀声明正确的证明。
生成特定服务接受的 XML 可能需要属性、序列约束、选择组和限定名称。使用其当前架构或文档来构建该映射。通用转换适用于检查和简单的以数据为中心的文档,不能替代合同感知序列化。
要点:在依赖它之前预测它的形状 - 以及语法转换器面板如何显示 JSON 文档生成的 XML 结构
根据结果预测信封、项目名称和类型损失。 ToolAcre 包装缺少一个根的值、重复数组、将 `@` 键映射到属性、用空文本替换 null 并拒绝非法名称而不是猜测替换。每个不明显的变化都会出现在输出或警告中。
测试包含顶级数组、重复记录、空值、数字文本和尴尬键的最小对象。拒绝是需要手动映射的有用证据。成功的文件仍然需要实际接收者的验证,因为格式正确的 XML 和模式有效的 XML 是不同的声明。
接收者接受样本后,仅在映射预计保留的地方添加反向检查。属性和重复子项可以根据 ToolAcre 自己的约定进行往返,而 null 和标量类型则不能。记录这种区别可以防止将成功的快乐路径示例推广到您的集成可能生成的每个订单文档。