我使用 Symfony 的 YAML 组件来解析这个问题中的 YAML。
我有以下 YAML:
db_driver: orm
service:
user_provider: user_provider
options:
supported_scopes: >
user_basic_information
internal
Run Code Online (Sandbox Code Playgroud)
最终出现在这个字符串中:
"user_basic_information internal
"
Run Code Online (Sandbox Code Playgroud)
但我喜欢得到这个字符串:
"user_basic_information internal"
Run Code Online (Sandbox Code Playgroud)
我找到了以下解决方法:
service:
user_provider: user_provider
options:
supported_scopes: >
user_basic_information
internal
db_driver: orm
Run Code Online (Sandbox Code Playgroud)
该块以正确的字符串结束,没有换行符。我的 YAML 解析器有问题还是缺少 YAML 语言定义?
是否有另一种方法来终止折叠样式块,这样我就不必以老套的方式进行操作?
这两个问题的答案都是肯定的。向顶层添加额外的键值对或任何其他映射不应影响折叠标量的最终换行符。
\n\n使用>, Folded block style,您总是会在文件末尾得到一个换行符,因为默认是剪切:
\n\n\n如果未指定明确的 chomping 指示符,则剪裁是使用的默认行为。在这种情况下,最后的换行符将保留在 scalar\xe2\x80\x99s 内容中。但是,任何尾随空行都会从 scalar\xe2\x80\x99s 内容中排除。
\n
如果您不想这样做,请使用显式的chomping 运算符,在本例中,要剥离,>-而不是仅仅使用>。(当然假设您的解析器正确解释了这一点)。
在Python中,使用ruamel.yaml(我是作者)可以正常工作:
\n\nimport ruamel.yaml\n\nyaml_str = """\\\ndb_driver: orm\nservice:\n user_provider: user_provider\n options:\n supported_scopes: >-\n user_basic_information\n internal\n"""\n\ndata = ruamel.yaml.safe_load(yaml_str)\nprint(repr(data[\'service\'][\'options\'][\'supported_scopes\']))\nRun Code Online (Sandbox Code Playgroud)\n\n您也可以在此处和此处在线查看(但是这个解析器还有一些其他问题)
\n