协慌网

登录 贡献 社区

YAML 和 JSON 有什么区别?

YAML 和 JSON 有什么区别,特别考虑以下几点?

  • 性能(编码 / 解码时间)
  • 内存消耗
  • 表情清晰
  • 图书馆的可用性,易用性(我更喜欢 C)

我打算在嵌入式系统中使用这两种方法之一来存储配置文件。

有关的:

我应该使用 YAML 还是 JSON 存储我的 Perl 数据?

答案

从技术上讲,YAML 是 JSON 的超集。这意味着,至少从理论上讲,YAML 解析器可以理解 JSON,但不一定可以理解。

请参阅标题为 “YAML:与 JSON 的关系”的部分中的官方规范。

通常,我喜欢某些关于 YAML 的东西,这些东西在 JSON 中不可用。

  • 正如@jdupont 所指出的,YAML 在视觉上更易于查看。实际上, YAML 主页本身就是有效的 YAML,但是对于人类而言,它很容易阅读。
  • YAML 能够使用 “锚” 引用 YAML 文件中的其他项目。因此,它可以处理在 MySQL 数据库中可能发现的关系信息。
  • YAML 是约 YAML 文件嵌入其他的序列化格式诸如 JSON 或 XML 更稳健。

在实践中,最后两点都不会对您或我所做的事情有影响,但从长远来看,我认为 YAML 将是更健壮和可行的数据序列化格式。

目前,AJAX 和其他 Web 技术倾向于使用 JSON。目前,YAML 被更多地用于脱机数据处理。例如,默认情况下,它包含在基于 C 的 OpenCV 计算机视觉软件包中,而 JSON 不包含在其中。

您将找到用于 JSON 和 YAML 的 C 库。 YAML 的库往往是较新的,但过去我对它们没有遇到任何麻烦。参见例如Yaml-cpp

差异:

  1. 根据您的使用方式,YAML 比 JSON 更具可读性
  2. JSON 通常更快,并且可能仍可与更多系统互操作
  3. 可以非常快速地编写一个 “足够好” 的 JSON 解析器
  4. 重复键,这是潜在的有效的 JSON,肯定是无效的 YAML。
  5. YAML 具有大量功能,包括注释和关系锚。因此,YAML 语法非常复杂,并且可能难以理解。
  6. 可以在 yaml 中编写递归结构: {a: &b [*b]} ,它将在某些转换器中无限循环。即使进行了循环检测,“yaml 炸弹” 仍然是可能的(请参阅xml bomb )。
  7. 由于没有引用,因此无法使用 JSON 中的对象引用序列化复杂的结构。因此,YAML 序列化可以更有效。
  8. 在某些编码环境中,使用 YAML 可以使攻击者执行任意代码

观察结果:

  1. Python 程序员通常是 YAML 的忠实拥护者,因为使用缩进(而不是方括号)来指示级别。
  2. 许多程序员认为将 “含义” 附加到缩进上是一个糟糕的选择。
  3. 如果数据格式将离开应用程序的环境,在 UI 中进行解析或在消息传递层中发送,则 JSON 可能是一个更好的选择。
  4. YAML 可以直接用于诸如语法定义之类的复杂任务,并且与发明新语言相比,YAML 通常是更好的选择。

绕开深奥的理论

这回答的是标题,而不是细节,因为大多数人只是从像我这样的 google 上的搜索结果中读取标题,所以我觉得有必要从网络开发人员的角度进行解释。

  1. YAML 使用空间缩进,这是 Python 开发人员熟悉的领域。
  2. JavaScript 开发人员喜欢 JSON,因为它是 JavaScript 的子集,并且可以在 JavaScript 内部直接解释和编写,还可以使用简写方式声明 JSON,在使用不带空格的典型变量名时,键中不需要双引号。
  3. 有很多解析器在 YAML 和 JSON 的所有语言中都能很好地工作。
  4. 在许多情况下,YAML 的空间格式可能更易于查看,因为格式要求使用更易于理解的方法。
  5. 如果您在编辑器中没有可见的空间格式,则 YAML 的表单虽然更紧凑,更易于查看,但是看起来很难手动编辑。制表符不是空格,因此如果您没有编辑器来将击键解释为空格,则会进一步造成混淆。
  6. 与要检查的 YAML 相比,JSON 的功能要少得多,因此 JSON 的序列化和反序列化速度要快得多,这使得更小更轻的代码可以处理 JSON。
  7. 一个常见的误解是,YAML 比 JSON 需要更少的标点并且更紧凑,但这完全是错误的。空格是不可见的,因此似乎字符更少,但是如果您计算实际空格,以便正确地解释 YAML 和正确的缩进就必须存在该空格,那么您会发现 YAML 实际上比 JSON 需要更多的字符。 JSON 不使用空格来表示层次结构或分组,并且可以很容易地进行平整,并删除了不必要的空格以进行更紧凑的传输。

房间里的大象:互联网本身

JavaScript 如此明显地在网络上占据了主导地位,JavaScript 开发人员更倾向于将 JSON 作为数据格式与流行的 Web API 一起使用,因此在一般意义上进行 Web 编程时,很难争辩使用 YAML 而不是 JSON,因为您很可能会被淘汰在团队环境中。实际上,大多数 Web 程序员甚至都不知道 YAML 的存在,更不用说考虑使用它了。

如果您正在执行任何 Web 编程,则 JSON 是默认的处理方式,因为在使用 JavaScript 时不需要任何翻译步骤,因此在这种情况下,您必须提出一个更好的参数以在 JSON 上使用 YAML。