我有一个JSON数组的对象,我试图转换为YAML。

{"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
  }

博士TL;

你想要的是:

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

映射

YAML中与JSON对象等价的是映射,它看起来像这样:

# 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

我们在数组(sequence)中有两个这样的对象:

- 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会产生预期的结果:

console.log (jsyaml.load (' apple: -股份:-75.088 日期:11/27/2015 -股份:75.088 日期:11/26/2015 ')); < script src = " https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js " > < /脚本>

你可以在这里看到它(并进行交互式编辑)。


上面的回答很好。另一种方法是使用很棒的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

为了补充已接受的答案,如果你对紧凑的空格感到困扰,你还可以这样做:

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

...这直接改编自YAML规范的例子2.4。