YAML еквівалент масиву об'єктів в JSON


193

У мене є масив об'єктів JSON, який я намагаюся перетворити на YAML.

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

Чи є рівнозначне представлення в YAML, яке не є лише JSON? Я хотів би зробити щось подібне

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

але найчистіша річ, яку я придумав, - це

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

Відповіді:


367

TL; DR

Ти хочеш це:

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

Відображення

Еквівалент YAML об'єкта JSON - це відображення, яке виглядає приблизно так:

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

Зауважте, що перші символи клавіш у блоковому відображенні повинні бути в одному стовпці. Демонструвати:

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

Послідовності

Еквівалент масиву JSON в YAML - це послідовність, яка виглядає як будь-яка з цих (які є еквівалентними):

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

У послідовності блоків -s має бути в одному стовпці.

JSON YAML

Давайте перетворимо ваш JSON в YAML. Ось ваш JSON:

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

Як суть справи, YAML - це сукупність JSON, тому вищезазначене вже є дійсним YAML - але давайте насправді використовувати функції YAML, щоб зробити це красивішим.

Починаючи зсередини, у нас є об'єкти, які виглядають так:

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

Еквівалентне відображення YAML:

shares: -75.088
date: 11/27/2015

У нас у масиві (послідовності) є два:

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

Зверніть увагу, як -вирівнюються s-лінія та перші символи клавіш відображення.

Нарешті, ця послідовність сама по собі є значенням у зіставленні з ключем AAPL:

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

Розбір цього і перетворення його в JSON дає очікуваний результат:

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

Ви можете побачити його (і редагувати його інтерактивно) тут .


Я оновив своє запитання, щоб відобразити, що в списку є кілька пунктів, що містять пари акцій та дати.
wegry

3
@wegry: Не має значення. Дивіться також приклад з веб-сайту YAML: yaml.org/start.html .
Фелікс Клінг

5

Чудова відповідь вище. Інший спосіб - використовувати чудовий інструмент для обгортки yaml jq, yq at https://github.com/kislyuk/yq

Збережіть приклад JSON у файл, скажімо, ex.json, а потім

yq -y '.' ex.json

AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.