YAML-Äquivalent zum Array von Objekten in JSON

191

Ich habe ein JSON-Array von Objekten, die ich in YAML konvertieren möchte.

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

Gibt es eine äquivalente Darstellung in YAML, die nicht nur JSON ist? Ich würde gerne so etwas machen

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

aber das sauberste, was ich mir ausgedacht habe, ist

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

Antworten:

364

TL; DR

Du willst das:

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

Zuordnungen

Das YAML-Äquivalent eines JSON-Objekts ist eine Zuordnung, die folgendermaßen aussieht:

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

Beachten Sie, dass sich die ersten Zeichen der Schlüssel in einer Blockzuordnung in derselben Spalte befinden müssen. Demonstrieren:

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

Sequenzen

Das Äquivalent eines JSON-Arrays in YAML ist eine Sequenz, die wie folgt aussieht (die äquivalent sind):

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

In einer Blocksequenz -muss sich das s in derselben Spalte befinden.

JSON zu YAML

Lassen Sie uns Ihren JSON in YAML verwandeln. Hier ist dein JSON:

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

Als Trivialität ist YAML eine Obermenge von JSON, daher ist das oben Genannte bereits für YAML gültig - aber lassen Sie uns tatsächlich die Funktionen von YAML verwenden, um dies schöner zu machen.

Von innen nach außen haben wir Objekte, die so aussehen:

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

Die entsprechende YAML-Zuordnung lautet:

shares: -75.088
date: 11/27/2015

Wir haben zwei davon in einem Array (Sequenz):

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

Beachten Sie, wie das -s und die ersten Zeichen der Zuordnungstasten ausgerichtet sind.

Schließlich ist diese Sequenz selbst ein Wert in einer Zuordnung mit dem Schlüssel AAPL:

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

Wenn Sie dies analysieren und wieder in JSON konvertieren, erhalten Sie das erwartete Ergebnis:

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

Sie können es sehen (und bearbeiten Sie es interaktiv) hier .

Jordan läuft
quelle
Ich habe meine Frage aktualisiert, um zu berücksichtigen, dass die Liste mehrere Elemente enthält, die Freigabe- und Datumspaare enthalten.
Wegry
3
@wegry: Macht keinen Unterschied. Siehe auch das Beispiel von der YAML-Website: yaml.org/start.html .
Felix Kling
5

Tolle Antwort oben. Eine andere Möglichkeit ist die Verwendung des großartigen yaml jq-Wrapper-Tools yq unter https://github.com/kislyuk/yq

Speichern Sie Ihr JSON-Beispiel in einer Datei, z. B. ex.json und dann

yq -y '.' ex.json

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