英文:
Mixing yaml and json
问题
YAML 是 JSON 的超集,这意味着我可以直接将 JSON 放入一个 .yml 文件中,它就能工作。
我想主要编写 JSON,但对于我的代码块,切换到 YAML 字面样式会很不错。
Chat Gpt 说我可以这样做(但它是错误的,尽管这个想法对我来说似乎是有效的):
{
"name": "John Doe",
"description": |
这是一个多行
使用 YAML 字面样式的描述
在 JSON 文件中。
"age": 30
}
“纯值不能以块标量指示符 | 开头,位于第3行,第20列:”
有人知道如何利用 YAML 是 JSON 超集的事实来允许这种混合匹配行为吗?
英文:
Yaml is a superset of json meaning I can literally just slap json into a .yml file and it works.
I would like to mostly write json, but for my code blocks it would be great to switch to the yaml literal style.
Chat Gpt Said I can do this, (but it's wrong though the idea seems valid to me)
{
"name": "John Doe",
"description": |
This is a multi-line
description using the YAML
literal style in a JSON file.
"age": 30
}
Plain value cannot start with block scalar indicator | at line 3, column 20:
Does anyone know a way to use the fact that yaml is a superset of json to allow this kind of mix and match behavior?
答案1
得分: 1
YAML有两种节点样式,block(块样式)和flow(流样式),通常使用block样式:
--- # 块映射
foo: bar
droggel: jug
--- # 块序列
- foo
- bar
--- # 流映射
{ foo: bar, droggel: jug }
--- # 流序列
[ foo, bar ]
--- # 流标量
droggeljug
--- # 块标量
|
droggeljug
块样式使用缩进来定义结构和嵌套,而流样式使用显式的特殊字符。
在块样式内可以使用流样式,这是有效的:
foo: [droggel, jug]
但是,流样式不允许在块样式内部使用。我不知道这个决定的具体原因,但这可能会使语法变得更加复杂,这似乎是一个可能的原因。
所以答案是:你不能在流映射中使用块标量。如果你想使用块标量,那么祖先节点也必须是块样式。然而,你可以在流样式中使用兄弟节点,所以下面这个是有效的:
name: "John Doe"
description: |
This is a multi-line
description using the YAML
literal style in a JSON file.
other: {
age: 30,
}
(提示:YAML规范要求关闭的 }
要比封闭块节点的缩进更深。但是,实现通常允许你将 }
放在第一列。我在这里进行了缩进以符合规范的要求)。
英文:
YAML has two node styles, block and flow, with block being the one that's usually used:
--- # block mapping
foo: bar
droggel: jug
--- # block sequence
- foo
- bar
--- # flow mapping
{ foo: bar, droggel: jug }
--- # flow sequence
[ foo, bar ]
--- # flow scalar
droggeljug
--- # block scalar
|
droggeljug
Block style uses indentation to define structure and nesting, while flow style uses explicit special characters.
Flow style is allowed within block style, making this valid:
foo: [droggel, jug]
However, block style is not allowed within flow style. I don't know what the reasoning for this decision was but it would make the syntax more complex than it already is, which seems a likely reason.
So the answer to your question is: You can't use a block scalar in a flow mapping. If you want to use a block scalar, are ancestor nodes must also be in block style. You can, however, give sibling nodes in flow style, so this would be valid:
name: "John Doe"
description: |
This is a multi-line
description using the YAML
literal style in a JSON file.
other: {
age: 30,
}
(Hint: the YAML spec requires the closing }
to be more indented than the enclosing block node. But implementations usually do allow you to put the }
on the first column. I indented it here for total spec conformance).
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论