Odpowiednik YAML tablicy obiektów w JSON

193

Mam tablicę JSON obiektów, które próbuję przekonwertować na YAML.

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

Czy w YAML istnieje równoważna reprezentacja, która nie jest tylko JSON? Chciałbym zrobić coś takiego

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

ale najczystszą rzeczą, jaką wymyśliłem, jest

AAPL:
  - {
    shares: -75.088,
    date: 11/27/2015
  }
  {
    shares: 75.088,
    date: 11/26/2015
  }
węgry
źródło

Odpowiedzi:

367

TL; DR

Chcesz to:

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

Mapowania

Odpowiednikiem YAML obiektu JSON jest odwzorowanie, które wygląda następująco:

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

Zauważ, że pierwsze znaki kluczy w odwzorowaniu bloków muszą znajdować się w tej samej kolumnie. Aby zademonstrować:

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

Sekwencje

Odpowiednikiem tablicy JSON w YAML jest sekwencja, która wygląda jak jedna z tych (które są równoważne):

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

W sekwencji bloków -s muszą znajdować się w tej samej kolumnie.

JSON do YAML

Zmieńmy JSON w YAML. Oto twój JSON:

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

Ciekawostką jest, że YAML jest nadzbiorem JSON, więc powyższe jest już prawidłowe YAML - ale w rzeczywistości skorzystajmy z funkcji YAML, aby uczynić to ładniejszym.

Zaczynając od wewnątrz, mamy obiekty, które wyglądają tak:

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

Równoważne odwzorowanie YAML to:

shares: -75.088
date: 11/27/2015

Mamy dwa z nich w tablicy (sekwencji):

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

Zwróć uwagę, jak ustawiają się w -linii s i pierwsze znaki klawiszy mapowania.

Wreszcie, ta sekwencja sama w sobie jest wartością w mapowaniu za pomocą klucza AAPL:

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

Analiza tego i konwersja z powrotem do JSON daje oczekiwany wynik:

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

Możesz go zobaczyć (i edytować interaktywnie) tutaj .

Jordan Running
źródło
Zaktualizowałem moje pytanie, aby odzwierciedlić, że na liście jest wiele pozycji zawierających pary akcji i dat.
węgry
3
@wegry: Nie robi różnicy. Zobacz także przykład ze strony internetowej YAML: yaml.org/start.html .
Felix Kling
5

Świetna odpowiedź powyżej. Innym sposobem jest użycie wspaniałego narzędzia do pakowania yaml jq, yq na https://github.com/kislyuk/yq

Zapisz przykład JSON w pliku, powiedzmy ex.json, a następnie

yq -y '.' ex.json

AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
Jon Scobie
źródło