YAML相当于JSON中的对象数组

weg*_*gry 137 arrays json yaml types

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

{"AAPL": [
  {
    "shares": -75.088,
    "date": "11/27/2015"
  },
  {
    "shares": 75.088,
    "date": "11/26/2015"
  },
]}
Run Code Online (Sandbox Code Playgroud)

YAML中是否有等效的表示形式,而不仅仅是JSON?我想做点什么

AAPL:
  - :
    shares: -75.088
    date: 11/27/2015
  - :
    shares: 75.088
    date: 11/26/2015
Run Code Online (Sandbox Code Playgroud)

但我提出的最干净的事情是

AAPL:
  - {
    shares: -75.088,
    date: 11/27/2015
  }
  {
    shares: 75.088,
    date: 11/26/2015
  }
Run Code Online (Sandbox Code Playgroud)

Jor*_*ing 275

TL; DR

你要这个:

AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015
Run Code Online (Sandbox Code Playgroud)

映射

JSON对象的YAML等价物是一个映射,如下所示:

# flow style
{ foo: 1, bar: 2 }
Run Code Online (Sandbox Code Playgroud)
# block style
foo: 1
bar: 2
Run Code Online (Sandbox Code Playgroud)

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

# OK
   foo: 1
   bar: 2
Run Code Online (Sandbox Code Playgroud)
# Parse error
   foo: 1
    bar: 2
Run Code Online (Sandbox Code Playgroud)

序列

YAML中JSON数组的等价物是一个序列,它看起来像这些中的任何一个(它们是等价的):

# flow style
[ foo bar, baz ]
Run Code Online (Sandbox Code Playgroud)
# block style
- foo bar
- baz
Run Code Online (Sandbox Code Playgroud)

在块序列中,-s必须在同一列中.

JSON到YAML

让我们把你的JSON变成YAML.这是你的JSON:

{"AAPL": [
  {
    "shares": -75.088,
    "date": "11/27/2015"
  },
  {
    "shares": 75.088,
    "date": "11/26/2015"
  },
]}
Run Code Online (Sandbox Code Playgroud)

作为一个琐事点,YAML是JSON的超集,所以上面已经是有效的YAML了 - 但让我们实际上使用YAML的功能来使这个更漂亮.

从内到外,我们有像这样的对象:

{
  "shares": -75.088,
  "date": "11/27/2015"
}
Run Code Online (Sandbox Code Playgroud)

等效的YAML映射是:

shares: -75.088
date: 11/27/2015
Run Code Online (Sandbox Code Playgroud)

我们在一个数组(序列)中有两个:

  • 股票: - 75.0888日期:2015年11月27日
  • 股票:75.088日期:2015年11月26日

注意-s排列和映射键的第一个字符是如何对齐的.

最后,此序列本身是使用键映射的值AAPL:

- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
Run Code Online (Sandbox Code Playgroud)

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

AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015
Run Code Online (Sandbox Code Playgroud)

您可以在此处查看(并以交互方式编辑).

  • @wegry:没有区别.另请参阅YAML网站上的示例:http://www.yaml.org/start.html. (3认同)

Cha*_*alk 25

如果紧密的间距困扰您,为了补充已接受的答案,您还可以执行以下操作:

AAPL:
  - 
    shares: -75.088
    date: 11/27/2015
  - 
    shares: 75.088
    date: 11/26/2015
Run Code Online (Sandbox Code Playgroud)

...这直接改编自YAML 规范的示例 2.4“映射序列”


Jon*_*bie 14

上面的答案很好。另一种方法是使用伟大的 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
Run Code Online (Sandbox Code Playgroud)