首页 > 解决方案 > 使用 Yaml folded > string 表示 A JSON 字符串会导致添加意外的换行符

问题描述

使用 YAML folded > string 表示 A JSON 字符串会导致添加意外的换行符。是否可以表示示例字符串而不在折叠字符串的每一行之后引入换行符?

- yaml: >-
    {
      "This" : "is supposed to be a JSON string.",
      "it" : "is not meant to be a yaml map itself.",
      "And": "if this string were passed into"
      "a": "json parser, it would THEN parse as a JSON map."
      "The": "confusing part to me is the newlines."
      "Normally": ">- folded style strings do not introduce"
      "newline": "characters between lines within the yaml"
      "folded": "There shouldn't be any newlines added."
      "But": "several unexpected newlines are introduced."
      "Does": "This have something to do with the special"
      "characters": "in the string?"
    }

这是生成的字符串,它在解析时在折叠的 >- 样式字符串的每一行末尾引入了一个换行符。

[ { "yaml": "{\n "This" : "应该是 JSON 字符串。",\n "it" : "本身并不意味着是 yaml 映射。",\n "And": "如果这个字符串被传递到"\n "a": "json 解析器,那么它将被解析为 JSON 映射。"\n "The": "让我感到困惑的是换行符。"\n "通常": ">- 折叠样式字符串不引入"\n "newline": "yaml 中的行间字符"\n "folded": "不应该添加任何换行符。"\n "But": "几个意外引入了换行符。"\n "Does": "这与特殊有关"\n "characters": "在字符串中?"\n}" } ]

根据我一直在阅读的规格,这不应该发生。其他折叠字符串不会发生这种情况,但对于这个例子来说,它可能与特殊字符有关。

虽然我已经看到它在至少两个 YAML 解析器(Python 的 pyyaml 和 Java 的蛇 YAML)中做到了这一点。它也出现在这个yaml 解析器 webapp中。

要么我误解了规范,要么库都错误地实现了它(也许是故意的,为了彼此兼容)。

最终,我问是因为我想在项目中使用 YAML 配置文件。但我担心我将无法完全按照我的意愿表示多行字符串(不引入意外的空格、换行符等)

标签: yaml

解决方案


您链接的规范部分直接解决了这个问题:

以空白字符(更多缩进的行)开头的行不被折叠。

规范中的示例 8.10 和 8.11 显示了如何不折叠更多的缩进行。在您的 YAML 代码中,除了{和之外的所有内容都}缩进更多,因此行不会折叠。

背景是折叠块标量希望使您能够拥有项目符号列表之类的东西,例如

content: >
  foo
 
   * one
   * two

  bar

并且这些项目符号每个都应该解析为一个完整的行,因此建立了规则,即不折叠更多缩进的行。正如您的示例所示,该规则已被证明对 YAML 出现的用例相当有害。

如果您不想要这种行为,我建议您定义一个像这样的本地标签:

content: !fold |
  foo
  
   * one
   * two
  
  bar

然后,您可以为您的标签编写一个自定义构造函数,该构造函数在最初展开的文字块标量内容上执行您想要的行折叠。


推荐阅读