YAML equivalente à matriz de objetos em JSON

193

Eu tenho uma matriz JSON de objetos que estou tentando converter para YAML.

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

Existe uma representação equivalente no YAML que não é apenas JSON? Eu gostaria de fazer algo como

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

mas a coisa mais limpa que eu criei é

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

Respostas:

367

TL; DR

Você quer isso:

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

Mapeamentos

O equivalente YAML de um objeto JSON é um mapeamento, que se parece com estes:

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

Observe que os primeiros caracteres das chaves em um mapeamento de bloco devem estar na mesma coluna. Para demonstrar:

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

Sequências

O equivalente a uma matriz JSON no YAML é uma sequência, que se parece com uma destas (que são equivalentes):

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

Em uma sequência de blocos, os -s devem estar na mesma coluna.

JSON para YAML

Vamos transformar seu JSON em YAML. Aqui está o seu JSON:

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

Como um ponto de trivialidade, o YAML é um superconjunto do JSON, portanto o código acima já é YAML válido - mas vamos realmente usar os recursos do YAML para torná-lo mais bonito.

Começando de dentro para fora, temos objetos parecidos com este:

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

O mapeamento YAML equivalente é:

shares: -75.088
date: 11/27/2015

Temos dois deles em uma matriz (sequência):

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

Observe como -se alinham os primeiros caracteres das teclas de mapeamento.

Finalmente, essa sequência é um valor em um mapeamento com a chave AAPL:

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

Analisar isso e convertê-lo novamente em JSON produz o resultado esperado:

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

Você pode vê-lo (e editá-lo interativamente) aqui .

Jordan Running
fonte
Atualizei minha pergunta para refletir que existem vários itens na lista que contêm pares de compartilhamentos e datas.
Wegry
3
@wegry: Não faz diferença. Veja também o exemplo do site da YAML: yaml.org/start.html .
Felix Kling
5

Ótima resposta acima. Outra maneira é usar a excelente ferramenta wrapper yaml jq, em https://github.com/kislyuk/yq

Salve seu exemplo JSON em um arquivo, ex.json e, em seguida,

yq -y '.' ex.json

AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
Jon Scobie
fonte