简体中文

开发者工具·语法转换器

比较四种数据模型:为什么 JSON、YAML、TOML 和 XML 从不映射 1:1

· 背景

数据格式 json yaml

四种不同的数据模型形状在受限的转换中心相遇
原始 ToolAcre 矢量图

这些格式之间的每次转换都会在某些地方有损,因为每种格式都是围绕不同的数据模型设计的。这篇文章比较了它们的类型系统和结构,以便您可以预测转换将保留什么以及将删除什么。

不会往返的配置 - 通过三种格式转换的文件和返回不同的字段

包含安全数字、字符串、布尔值、数组和嵌套对象的普通对象可以通过 JSON-to-YAML-to-JSON 和 JSON-to-TOML-to-JSON 测试。在 TOML 之前添加 null、来自 TOML 的日期时间、混合 XML 内容或 YAML 注释,以及某些值或源信息更改。

有用的问题不是转换是否普遍有损。它是哪个输入类和哪个方向保留您需要的属性。 ToolAcre 的警告和拒绝使该矩阵变得可观察,而不是将每一对简化为一个营销承诺。

代表性配置可以在某些对之间往返,但不是每个受支持的形状

JSON 在此解析器中提供 null、布尔值、数字、字符串、数组和对象。它没有注释、日期时间类型或共享引用语法。 JavaScript 将数字解析为 IEEE-754 双精度数,因此超出安全范围的已未加引号的整数可能会在其他编写者看到它之前失去精度。

对象键是字符串,可选的排序会改变它们的呈现方式。数组保持有序。严格的解析拒绝注释、尾随逗号和非有限数字标记,为其他读者建立紧凑的基线。

JSON 的值模型

ToolAcre 通过受限的 JSON 或核心架构接受 YAML。锚点和别名解析,注释消失,流变成数组,重复的键保留最后一个值并带有警告,并且拒绝递归或爆炸性别名。

自定义标签、二进制、时间戳、集合和语言对象构造函数被拒绝。 Core Infinity 和 NaN 在目标格式中变为空并带有警告。这是有意成为 YAML 更广泛的标签系统的子集,而不是完整的 YAML 对象支持。

受限制的 YAML 模型 ToolAcre 接受

TOML 以表开头,支持字符串、有符号整数、浮点数、布尔值、数组、表和四种临时类型。它没有空值。 ToolAcre 将日期和时间转换为面向源的字符串,将宽整数转换为十进制字符串,而不是丢失数字。

当写入 TOML 时,空对象键被省略,空数组条目变成空字符串。根数组和标量被拒绝。注释和作者在标题、点键和内联表之间的选择不会通过纯值返回。

TOML 的根表、临时值和空边界

XML 被投影为具有 `@` 属性、普通子键、`#text`、`#cdata`、重复同级数组和文字命名空间前缀的树。评论、声明和处理说明将被删除。混合文本位置丢失,在重复出现之前无法知道一对多。

值作为字符串读取,除非选择推理。从 JSON 写入的 Null 成为空元素,并且在返回时无法与空字符串区分开。每个 DOCTYPE 都会被拒绝,无效的名称会停止序列化而不是被重写。

ToolAcre 的 XML 投影:元素、属性、文本和文字前缀

九个方向运送:JSON 至 YAML、XML、TOML 和 CSV; YAML 至 JSON 和 TOML; TOML 至 JSON 和 YAML; XML 至 JSON。 JSON 形状的普通值在 JSON 和 YAML 之间效果最好。 TOML 引入日期和空边界。 XML 需要命名和节点类别约定。

CSV 是一个平坦的异常值,仅作为输出。数组或选定的对象变成行,嵌套路径展平为点列,空值与空文本合并,类似公式的字符串被中和。 CSV-to-JSON、XML-to-TOML 和其他不存在的对将被拒绝而不是推断。

九个发货方向的兼容性矩阵,仅 CSV 作为输出

二进制格式和模式语言超出范围。模式可以恢复列表基数或验证业务形状,而二进制编码引入了此处未表示的字节级类型和框架。转换器从未声称具有这些功能。

语法转换也不能证明应用程序的有效性。干净的 Kubernetes 形状的 YAML、XML 订单消息或 TOML 项目文件仍然可能违反目标合约。检查语法映射后使用域验证器。

要点:选择模型,然后选择语法 - 以及语法转换器面板如何让您在提交之前测试转换

在选择标点符号之前选择数据模型。如果注释和别名很重要,则 JSON 跃点无法保留它们。如果 null 很重要,则 TOML 输出会更改它。如果有序的混合内容很重要,那么简单的 JSON 投影是不够的。如果目标是表,则嵌套 JSON 需要显式展平约定。

使用 ToolAcre 测试一份代表性文档并阅读每条警告。结果是关于具体对和输入的证据,而不是允许调用所有无损转换或每个支持的解析器完成。

从与您的服务相关的边界构建代表性文档:null、空文本、大标识符、类似日期的字符串、一条重复记录、注释或别名(如果涉及 YAML),以及混合文本(如果涉及 XML)。在每个支持的跃点后比较标准化值并保留结果的警告。该矩阵成为所选模型的决策工件,而不是对熟悉语法的模糊偏好。