Многолинейные массивы YAML


140

В YAML вы можете легко создавать многострочные строки . Однако мне бы хотелось иметь возможность создавать многострочный массив (в основном для удобства чтения в файлах конфигурации) с использованием |символа.

YAML массив может быть представлен в виде: ['key1', 'key2', 'key3'].

YAML последовательность использует тир , а затем пробел , а затем строка:

- String1
- String2
- String3

Это будет вычисляться: ['string1', 'string2', 'string3'].

Отображение YAML - это массив пар ключей и значений, которые мы все время видим в YAML:

Key1: string1
Key2: string2
Key3: string3

Это все хорошо, но я не могу понять, как сделать многострочный массив. Что-то вроде этого:

|
['string1', 'string2', 'string3']
['string4', 'string5', 'string6']

Если не считать создания множественных отображений массивов в YAML и объединения их на моем языке выбора, есть ли способ достичь многострочных массивов, может быть, с помощью { }Python, но в YAML?


честно, что такое многострочный массив и когда он вообще должен быть значимым? Вместо того, чтобы просто смотреть ваш код
OK999

Необходимость прокручивать экран по горизонтали, чтобы увидеть все варианты, а не видеть их все на одном экране одновременно.
Джимбо

Ответы:


241

YAML последовательность является массивом . Так что это правильный способ выразить это:

key:
  - string1
  - string2      
  - string3
  - string4
  - string5
  - string6

Это идентично по значению:

key: ['string1', 'string2', 'string3', 'string4', 'string5', 'string6']

Также допустимо разбивать однострочный массив на несколько строк:

key: ['string1', 'string2', 'string3', 
  'string4', 'string5', 
  'string6']

и даже иметь многострочные строки в однострочных массивах:

key: ['string1', 'long
  string', 'string3', 'string4', 'string5', 'string6']

1
это проблема, если строки начинаются с - (например, параметры передаются в командной строке)? тогда я должен цитировать? `-" -myarg "`?
ekkis

2
Это полностью зависит от того, какую программу вы используете для анализа YAML. Этот вопрос касается только спецификации YAML.
Стив Беннетт

39

ты пробовал это?

-
  name: Jack
  age: 32
-
  name: Claudia
  age: 25

Я получаю это: [{"name"=>"Jack", "age"=>32}, {"name"=>"Claudia", "age"=>25}](Я использую YAMLкласс Ruby).


6

Следующее будет работать:

myarray: [
  String1, String2, String3,
  String4, String5, String5, String7
]

Я проверил это с помощью реализации snakeyaml, хотя я не уверен в других реализациях.


2
он работал с Puppet Enterprise 3.7 hiera yaml (Ruby yaml). Одна вещь, которую я считаю ruby ​​yaml, довольно чувствительна - это идентификация, и избегайте использования вкладок. поэтому приведенный выше пример должен быть похож на две строки с одинаковым количеством пробелов, где первая строка, myarray: [String1, String2, String3,а вторая строка - `String4, String5, String5, String7]`
Валид

2

Следующее работает для меня и хорошо с точки зрения читабельности, когда значения элементов массива малы:

key: [string1, string2, string3, string4, string5, string6]

Примечание: используется реализация snakeyaml


0

Если вам нужен массив массивов, вы можете сделать это следующим образом:

key:
  - [ 'value11', 'value12', 'value13' ]
  - [ 'value21', 'value22', 'value23' ]

Спасибо Винициусу, но в вопросе прямо сказано: «Мне бы хотелось иметь возможность создавать многострочный массив», а не несколько строк из нескольких массивов.
Джимбо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.