YAML等效于JSON中的对象数组


192

我有一个要转换为YAML的对象的JSON数组。

{"AAPL": [
  {
    "shares": -75.088,
    "date": "11/27/2015"
  },
  {
    "shares": 75.088,
    "date": "11/26/2015"
  },
]}

YAML中是否有不只是JSON的等效表示形式?我想做类似的事情

AAPL:
  - :
    shares: -75.088
    date: 11/27/2015
  - :
    shares: 75.088
    date: 11/26/2015

但是我想出的最干净的方法是

AAPL:
  - {
    shares: -75.088,
    date: 11/27/2015
  }
  {
    shares: 75.088,
    date: 11/26/2015
  }

Answers:


365

TL; DR

你要这个:

AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015

对应

相当于JSON对象的YAML是一个映射,如下所示:

# flow style
{ foo: 1, bar: 2 }
# block style
foo: 1
bar: 2

请注意,块映射中键的第一个字符必须在同一列中。展示:

# OK
   foo: 1
   bar: 2
# Parse error
   foo: 1
    bar: 2

顺序

YAML中的JSON数组的等效项是一个序列,看起来像以下任何一个(等效项):

# flow style
[ foo bar, baz ]
# block style
- foo bar
- baz

在块序列中,-s必须位于同一列中。

JSON到YAML

让我们将JSON转换为YAML。这是您的JSON:

{"AAPL": [
  {
    "shares": -75.088,
    "date": "11/27/2015"
  },
  {
    "shares": 75.088,
    "date": "11/26/2015"
  },
]}

琐碎的一点是,YAML是JSON的超集,因此以上内容已经是有效的YAML,但实际上让我们使用YAML的功能来使其更漂亮。

从内到外,我们具有如下对象:

{
  "shares": -75.088,
  "date": "11/27/2015"
}

等效的YAML映射为:

shares: -75.088
date: 11/27/2015

我们有两个这样的数组(序列):

- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015

请注意-s的排列方式以及映射键的第一个字符如何排列。

最后,此序列本身就是带有键的映射中的值AAPL

AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015

对此进行解析并将其转换回JSON会产生预期的结果:

{
  "AAPL": [
    {
      "date": "11/27/2015", 
      "shares": -75.088
    }, 
    {
      "date": "11/26/2015", 
      "shares": 75.088
    }
  ]
}

您可以在此处查看(并进行交互式编辑)。


我已经更新了我的问题,以反映列表中包含共享和日期对的多个项目。
挪威,2015年

3
@wegry:没什么关系。另请参见YAML网站上的示例:yaml.org/start.html
Felix Kling 2015年

5

上面的好答案。另一种方法是使用伟大的Yaml jq包装器工具yq,网址https://github.com/kislyuk/yq

将您的JSON示例保存到文件,例如ex.json,然后

yq -y '.' ex.json

AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.