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
  }
wegry
источник

Ответы:

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
    }
  ]
}

Вы можете увидеть его (и отредактировать в интерактивном режиме) здесь .

Джордан Бег
источник
Я обновил свой вопрос, чтобы отразить, что в списке есть несколько элементов, содержащих пары акций и дат.
августа
3
@ Вегри: не имеет значения. Смотрите также пример с сайта YAML: yaml.org/start.html .
Феликс Клинг
5

Отличный ответ выше. Другой способ - использовать отличный инструмент-обертку yaml jq, yq на 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
Джон Скоби
источник