Многострочные строки YAML: ключи против значений массива

Это очень специфично, но оставило меня в тупике. Мы обрабатываем вложенные ключи + регулярные массивы почти одинаково при разборе-иногда добавляя дополнительную информацию, когда это необходимо, например:

---
Entry 1:
    - lorem:
        true
    - ipsum
    - dolor
Entry 2:
    - lorem
    - ipsum:
        true
    - dolor
...

... который дает мне этот JSON:

{
  "Entry 2": [
    "lorem", 
    {
      "ipsum": true
    }, 
    "dolor"
  ], 
  "Entry 1": [
    {
      "lorem": true
    }, 
    "ipsum", 
    "dolor"
  ]
}

все круто и хорошо. Ввод многострочных строк для контента становится более беспорядочным, но все равно работает нормально (продолжайте вставлять их в онлайн парсер YAML или какой-либо другой компилятор для справки):

---
#works:

Test:
  - lorem
  - ipsum
  - dolor
? |-
    multiline
    Test
:
  - lorem
  - ipsum:
      true
  - dolor
...

идем глубже, многострочные строки в моем массиве 2-го уровня также работают, как и ожидалось спецификацией:

---
#works:
Test:
    - |-
        multiline
        lorem
    - ipsum
    - dolor
? |-
    multiline
    Test
:
    - lorem
    - ipsum:
        true
    - dolor
...

нет wohoo! Но как только я ... --16-->mix многострочные ключи и строки многострочного массива на одном уровне, моя настройка прерывается:

---
#breaks:
Test:
    - |-
        multiline
        lorem
    ? |- 
        multiline
        ipsum
    : 
        true
? |-
    multiline
    Test
:
    - lorem
    - ipsum:
        true
    - dolor
...

как исправить?

1 ответов


YAML ломается, если вы смешиваете ключи и элементы массива на одном уровне. Для этого вам не нужны многострочные строки:

- 1
? 2
: 3

к чему этот разбор? Массив? Картирование? Это, однако, работает:

- 1
- ? 2
  : 3

таким образом, вы можете исправить свой YAML следующим образом:

---
Test:
    - |-
        multiline
        lorem
    - ? |- 
          multiline
          ipsum
      : 
        true
? |-
    multiline
    Test
:
    - lorem
    - ipsum:
        true
    - dolor
...