Equivalente YAML di array di oggetti in JSON


193

Ho un array JSON di oggetti che sto cercando di convertire in YAML.

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

Esiste una rappresentazione equivalente in YAML che non è solo JSON? Mi piacerebbe fare qualcosa del genere

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

ma la cosa più pulita che mi è venuta in mente è

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

Risposte:


367

TL; DR

Tu vuoi questo:

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

Mapping

L'equivalente YAML di un oggetto JSON è una mappatura, che assomiglia a questi:

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

Si noti che i primi caratteri delle chiavi in ​​una mappatura di blocchi devono trovarsi nella stessa colonna. Dimostrare:

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

sequenze

L'equivalente di un array JSON in YAML è una sequenza, che assomiglia a uno di questi (che sono equivalenti):

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

In una sequenza di blocchi -s deve trovarsi nella stessa colonna.

JSON a YAML

Trasformiamo il tuo JSON in YAML. Ecco il tuo JSON:

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

Come punto di curiosità, YAML è un superset di JSON, quindi quanto sopra è già valido YAML, ma usiamo effettivamente le funzionalità di YAML per renderlo più bello.

A partire da dentro, abbiamo oggetti che assomigliano a questo:

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

La mappatura YAML equivalente è:

shares: -75.088
date: 11/27/2015

Ne abbiamo due in un array (sequenza):

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

Nota come si -allineano la s e i primi caratteri dei tasti di mappatura.

Infine, questa sequenza è essa stessa un valore in una mappatura con la chiave AAPL:

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

Analizzando questo e riconvertendolo in JSON si ottiene il risultato atteso:

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

Puoi vederlo (e modificarlo in modo interattivo) qui .


Ho aggiornato la mia domanda per riflettere che ci sono più elementi nell'elenco che contengono coppie di condivisioni e date.
Wegry,

3
@wegry: non fa differenza. Vedi anche l'esempio dal sito Web YAML: yaml.org/start.html .
Felix Kling,

5

Ottima risposta sopra. Un altro modo è utilizzare il fantastico strumento wrapper yaml jq, yq su https://github.com/kislyuk/yq

Salva il tuo esempio JSON in un file, ad esempio ex.json e poi

yq -y '.' ex.json

AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.