YAML-equivalent van array van objecten in JSON

Ik heb een JSON-array met objecten die ik naar YAML probeer te converteren.

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

Is er een equivalente representatie in YAML die niet alleen JSON is? Ik zou graag iets willen doen als

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

maar het schoonste wat ik heb bedacht is

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

Antwoord 1, autoriteit 100%

TL;DR

Je wilt dit:

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

Toewijzingen

Het YAML-equivalent van een JSON-object is een toewijzing, die er als volgt uitziet:

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

Houd er rekening mee dat de eerste tekens van de sleutels in een bloktoewijzing in dezelfde kolom moeten staan. Om te demonstreren:

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

Sequenties

Het equivalent van een JSON-array in YAML is een reeks die eruitziet als een van deze (die equivalent zijn):

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

In een blokreeks moeten de -s in dezelfde kolom staan.

JSON naar YAML

Laten we van uw JSON YAML maken. Dit is je JSON:

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

Als een punt van trivia is YAML een superset van JSON, dus het bovenstaande is al geldige YAML, maar laten we de functies van YAML gebruiken om dit mooier te maken.

Van binnen naar buiten beginnen we met objecten die er als volgt uitzien:

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

De equivalente YAML-toewijzing is:

shares: -75.088
date: 11/27/2015

We hebben er twee in een array (reeks):

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

Merk op hoe de -s op een rij staan en de eerste tekens van de toewijzingstoetsen.

Ten slotte is deze reeks zelf een waarde in een mapping met de sleutel AAPL:

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

Dit ontleden en terug converteren naar JSON levert het verwachte resultaat op:

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

Je kunt het zien (en interactief bewerken) hier.


Antwoord 2, autoriteit 3%

Geweldig antwoord hierboven. Een andere manier is om de geweldige yaml jq wrapper-tool te gebruiken, yq op https://github.com/kislyuk/yq

Sla je JSON-voorbeeld op in een bestand, zeg ex.json en dan

yq -y '.' ex.json
AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015

Antwoord 3

Als aanvulling op het geaccepteerde antwoord als de krappe tussenruimte u stoort, kunt u ook het volgende doen:

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

…dit is rechtstreeks overgenomen uit voorbeeld 2.4 van de YAML-specificatie.

Other episodes