YAML作为JSON超集和TAB字符

我无法完全找到对这个错误的引用,但YAML 1.2说它是一个JSON超集,如果我在JSON中使用制表符,它会将其视为一个错误。

例如

"root": {
        "key": "value"
}

(在线验证说't' that cannot start any token

我知道为什么YAML历史上不允许使用制表符,但是我怎样才能在JSON-superset的上下文中解释这一点?

(例如,YAML不是一个真正的超集,或者JSON是否也禁止选项卡?或者该规范确实允许在这种情况下使用选项卡,但实现还没有?)

谢谢。


允许在YAML中使用选项卡,但仅适用于缩进不适用的情况。

根据YAML 1.2第5.5节:

YAML识别两个空白字符:空格和制表符。

以下示例将使用·表示空格,用表示制表符。 所有示例都可以使用官方的YAML Reference Parser进行验证。

YAML有块风格和流风格。 在块样式中,缩进决定了文档的结构。 以下文档使用块样式。

root:
··key: value

验证

在流式中,特殊字符表示文档的结构。 以下等效文档使用流式。

{
→ root: {
→ → key: value
→ }
}

验证

您甚至可以在流式中混合缩进。

{
→ root: {
··→ key: value
····}
}

验证

如果您正在混合块和流动样式,则整个流动样式部分必须尊重块样式缩进。

root:
··{
····key: value
··}

验证

但是,您仍然可以在流式样部分中混合您的缩进。

root:
··{
··→ key: value
··}

验证

如果你有一个单一的有价值文件,你可以用各种空格来包围这个值。

→ ··value··→ 

验证

关键是,每个被解析为YAML的JSON文档都会将文档置于流式样中(因为支持制表符的初始{[字符),除非它是单个值的JSON文档,在这种情况下,YAML仍然允许使用填充空白。

如果由于JSON文档中的选项卡而导致YAML解析器抛出,那么它不是有效的解析器。

这就是说,你的例子失败了,因为如果块样式映射值不与映射名称在同一行上,它必须始终缩进。

root: {
··key: value
}

然而,这是无效的

root:
··{
····key: value
··}

是有效的,并且

root: { key: value }

也是有效的。


我知道为什么YAML历史上不允许使用制表符,但是我怎样才能在JSON-superset的上下文中解释这一点?

考虑其余规格,我们只能得出结论,“超集”评论是不准确的。 YAML规范与Relation to JSON部分的基本不一致:

因此,YAML可以被视为JSON的自然超集,提供改进的人类可读性和更完整的信息模型。 实际情况也是如此; 每个JSON文件也是一个有效的YAML文件。 如果/需要附加功能,这可以轻松地从JSON迁移到YAML。

JSON的RFC4627要求映射键只是“应该”是唯一的,而YAML坚持他们“必须”。 从技术上讲,YAML因此符合JSON规范,选择将重复项视为错误。 在实践中,由于JSON对这种重复的语义没有提及,唯一可移植的JSON文件是具有唯一键的那些文件,因此它们是有效的YAML文件。

尽管将YAML声明为“JSON的自然超集”并声明“每个JSON文件也是有效的YAML文件”,但该规范立即注意到有关密钥唯一性的一些差异。 可以说,规范还应该注意在这里使用制表符缩进的差异。

说到这一点,正如验证者暗示的那样,YAML明确禁止制表符作为缩进字符:

为了保持可移植性,不能在缩进中使用制表符,因为不同的系统对制表符的处理方式不同。 请注意,大多数现代编辑器可能被配置为使得按下制表符键导致插入适当数量的空格。

当然,这比JSON规范更严格,它只是简单地陈述:

可以在任意一对令牌之间插入空格。

所以,要直接回答你的问题......

(例如,YAML不是一个真正的超集,或者JSON是否也禁止选项卡?或者该规范确实允许在这种情况下使用选项卡,但实现还没有?)

... YAML实际上并不是一个超集,JSON并不禁止制表符,而YAML规范确实禁止显式地使用制表符。


根据规范标签从来没有被允许。 所以,当在YAML中使用JSON时,它不允许制表符。

当我们将JSON视为YAML的纯子集时,就会出现问题。 但根据规范中的Relation to JSON部分的Relation to JSON ,这不是一些小的事情,它使json不再是YAML的纯子集。

如果我们要解决这些不相似之处,我们需要的就是YSON,这在规范中也提到了。

但幸运的是,有些YAML引擎支持制表符作为缩进。 Snakeyml就是一个例子。

链接地址: http://www.djcxy.com/p/37851.html

上一篇: YAML as a JSON superset and TAB characters

下一篇: Where can I find System.Web.Helpers, System.Web.WebPages, and System.Web.Razor?