我明天有 Comp Tia Linux+ (XK0-004) 考试。我从 Amazon 购买了《Compt Tia Linux+ All in one Exam Guide》一书,这本书与 Google 搜索中有关 JSON 和 YAML 的内容相矛盾。
书上在CH 18 Review里说得很清楚:
JSON 和 YAML 是可用于数据序列化的标记语言。
YAML 代表另一种标记语言。
Stackoverflow 上的搜索结果:
- JSON 不是标记语言:JSON 是一种像 XML 一样的标记语言吗? [复制]
- YAML 代表 YAML 不是标记语言:如果 YAML 不是标记语言,那它是什么?
准确引用来自自称创建 YAML 贡献者的回答为 +140:
“我们一起工作了几个月后,我指出 YAML(当时绝对代表另一种标记语言)并不是真正的标记语言(标记文本文档的各种元素),而是一种序列化语言(类型化/循环数据图的文本表示)我们都喜欢 YAML 这个名字,所以我们将其反向命名为 YAML Ain't Markup Language。”
答案1
如果您想了解这两种技术,我建议阅读它们的规范:
YAML 人员所说的通常是正确的:它不是一个标记语言和更多符号对于物体之类的东西。我认为 JSON 的定义最能说明问题:
JSON(JavaScript 对象表示法)是一种轻量级数据交换格式。
A标记语言用于标记例如文本。
事实上,通常使用标记语言来定义整个对象结构(如 HTML 或 XML),这使得两者之间的区别变得模糊,但 YAML 和 JSON 之类的东西只能定义完整的结构(即使它是更大的对象结构的子部分)集合等),而文档中可以完全不存在标记。在 HTML 之类的内容中,空文档仍然包含一些结构(例如,是由于后来添加的约束)的原因<html> <head> ... </head> <body> ... </body> </html>
。从技术上讲,根本没有标签的纯文本文档也是有效的 HTML。
另一个有趣的做法是降价,这显然是一种标记语言,很少用于定义用于信息交换的类对象结构。另一方面你有TOML(“汤姆自己的标记语言”)它称自己为标记语言,但显然不是。
我还没有看到 JSON 被用作标记语言,TOML 也是如此。从技术上讲,YAML 可以用作标记语言,但没有必要,因为有更好的解决方案。一堆标记语言或多或少都构成了良好的对象定义语言(例如 XML),但是使用数据定义语言进行标记通常是一种糟糕的体验。但在某些情况下,这种区别一般来说是非常模糊的——因此我们有一堆标记兼具这两种功能的语言(例如 HTML)。在某种程度上,这取决于用例。主要用于注释的语言,无论是渲染、网络通信等,但这里主要关注的是未注释的内容,那么它是一种标记语言。
相反,如果实际内容仅被视为数据,而不是“文档”,那么它是一种数据定义语言等。如果文档中缺少标记,它不会破坏文档,内容仍然存在,只是可能组织性较差,可读性或可解析性较差。
在像 JSON 这样的数据定义语言中,如果缺少像 JSON 这样的结构,而只保留内容(例如纯文本),则一组数据并不真正存在 - 那将不再是 JSON。
在我看来,最大的用词不当是 XML。从它的名字来看,它是一种标记语言,但它几乎从未被这样使用过,相反,它几乎只用于序列化数据。因此,我认为名称中的“标记语言”一词经常被错误地使用。原因可能是(我猜,我不确定)初衷。 XML 最初是故意的作为一种“可扩展标记语言”,但它最终仅用于数据序列化和对象表示法等。另一个原因可能是营销等。
最后,我想引用这篇摘要YAML 规范 (我突出显示的一些词):
1.3.与 JSON 的关系
JSON 和 YAML 的目标都是成为人类可读的数据交换格式。但是,JSON 和 YAML 具有不同的优先级。 JSON 最重要的设计目标是简单性和通用性。因此,JSON 的生成和解析都很简单,但代价是降低了人类可读性。它还使用最低公分母信息模型,确保任何 JSON 数据都可以通过每个现代编程环境轻松处理。
相比之下,YAML 最重要的设计目标是人类可读性和支持序列化任意本机数据结构。因此,YAML 允许生成极其可读的文件,但生成和解析更加复杂。此外,YAML 超越了最低公分母数据类型,在不同编程环境之间跨越时需要更复杂的处理。
因此,YAML 可以被视为 JSON 的自然超集,提供改进的人类可读性和更完整的信息模型。实践中也是如此;每个 JSON 文件也是一个有效的 YAML 文件。如果/当需要附加功能时,这使得从 JSON 迁移到 YAML 变得容易。
[…]
定义 YAML 和 JSON 之间的中间格式可能很有用。这种格式解析起来很简单(但人类可读性较差),例如 JSON。同时,它允许序列化任意本机数据结构,例如 YAML。这种格式也可以作为 YAML 的“规范格式”。定义这样的“YSON”格式(YSON 是序列化对象表示法)可以通过增强 JSON 规范或限制 YAML 规范来完成。这样的定义超出了本规范的范围。
请注意该段落中没有术语“标记语言”。相反,它提到了它是如何作为一种交换格式并为数据序列化而设计的。在最后一部分中,他们讨论了创建中间格式,该格式可能更适合所规定的任何要求。这进一步证明了“标记语言”与“标记语言”之间的界限并不明确,并且存在某种定义“灰色地带”。
总的来说,我建议不仅仅是“谷歌搜索”,而是尝试找到定义,并阅读所述技术的开发人员的定义。所以你完成了谷歌搜索步骤,但下次,还要阅读它的文档等。
如果您的书与开发人员对其技术或产品的说法相矛盾:教科书可能是错误的,而且开发人员或作者定义的任何内容都可能毫无意义,所以不要将两者都视为福音。如果有疑问,请了解这两种技术,看看它与他们对自己的描述或教科书的描述有多少一致。一些教科书作者也简单地采用了开发者的定义等。
通常,您始终可以使用稍微更广泛的定义来引用它。 XML 和 JSON 无疑都是对象表示法,可以用作定义语言。像OGDL简单地称自己为“有序图定义语言”,这对于 XML 或几乎任何使用树状结构的语言(包括 JSON)来说都是有效的描述。