在YAML中构建字典项的数组?

96

基本上是想使用YAML完成以下JSON中的操作:

{
models:
 [
  { 
    model: "a"
    type: "x"
    #bunch of properties...
  },
  {
    model: "b"
    type: "y"
    #bunch of properties...
  }
 ]
}

到目前为止,这就是我所拥有的,它无法正常工作,因为我重复了我的model键,但通过保留model关键字,有什么正确的方法可以做到这一点呢?

models:
 model:
  type: "x"
  #bunch of properties...
 model:
  type: "y"
  #bunch of properties...

3
你尝试过将JSON代码加载到本地数据结构中(使用你选择的编程语言),然后使用YAML库对该结构进行序列化吗?让机器为你完成工作总是更容易的。 :) - Charles Duffy
2个回答

201

使用破折号开始一个新的列表元素:

models:
 - model: "a"
   type: "x"
   #bunch of properties...
 - model: "b"
   type: "y"
   #bunch of properties...

92

你可能已经看了太长时间的YAML,因为在你的帖子中所称之为JSON的东西其实不是JSON,更像是YAML和JSON混合的产物。我们先不谈JSON不允许以#开头的注释这一事实,你应该引用作为键的字符串,并且在映射中的元素之间应该加上,

{
"models":
 [
  {
    "model": "a",
    "type": "x"
  },
  {
    "model": "b",
    "type": "y"
  }
 ]
}
是正确的JSON格式,也是YAML格式,因为YAML是JSON的超集。你可以在YAML解析器上在线检查。

您可以使用ruamel.yaml.cmd将其转换为您喜欢的块状样式的YAML(基于我增强版的PyYAML:pip install ruamel.yaml.cmd )。您可以使用其命令行工具将JSON转换为块状YAML(在0.9.1版本中,您还可以强制使用流样式):

yaml json in.json

这会让你得到:

models:
- model: a
  type: x
- model: b
  type: y

有一些在线资源可以让您完成上述操作,但是跟任何此类服务一样,请不要将它们用于重要事项(比如信用卡号码列表和密码等)。


21
这确实更好的答案。我的被接受了,有点尴尬。 - Charles Duffy
4
谢谢,但从点赞数来看,显然你的回答更受大家欢迎,而我的不是。 - Anthon
3
我将其归结为“人们想要”与“人们需要”的对立。您在此提出的观点非常重要——使用诸如JQ之类的工具生成YAML,然后使用您提供的工具将其转换为分块样式,将比试图手动生成文本以适应示例的人拥有更加强大的解决方案。 - Charles Duffy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接