248

In YAML, you can easily create multi-line strings. However, I would like the ability to create a multi-line array (mainly for readibility within config files) using the | character.

A YAML array can be represented as: ['key1', 'key2', 'key3'].

A YAML sequence uses a dash followed by a space and then a string:

- String1
- String2
- String3

This would evaluate to: ['string1', 'string2', 'string3'].

A YAML mapping is an array of key and value pairs that we see all the time in YAML:

Key1: string1
Key2: string2
Key3: string3

This is all well and good, but I can't for the life of me see how to do a multi-line array. Something like this:

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

Short of creating multiple array mappings in YAML and merging them in my programming language of choice, is there any way to achieve multi-line arrays, maybe with { } like Python has but in YAML?

4
  • honestly, whats a multi-line array & when should it be meaningful at all? Rather than just the looks of your code
    – OK999
    Commented Oct 22, 2017 at 15:32
  • 3
    Having to scroll across the screen horizontally to see all the options rather than see them all one one screen at once.
    – Jimbo
    Commented Oct 22, 2017 at 16:53
  • 3
    Multi-line may make diffs much more readable, since every item added or removed corresponds to 1 line added or removed. Commented Jun 15, 2021 at 7:34
  • @XedinUnknown Good technical argument and reasoning - version control usage is impacted less with future changes. Thanks for sharing.
    – Jimbo
    Commented Jun 16, 2021 at 11:16

5 Answers 5

454

A YAML sequence is an array. So this is the right way to express it:

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

That's identical in meaning to:

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

It's also legal to split a single-line array over several lines:

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

and even have multi-line strings in single-line arrays:

key: ['string1', 'long
  string', 'string3', 'string4', 'string5', 'string6']
2
  • 2
    is it an issue if the strings start with a - (e.g. options passed in the command line)? do I then have to quote? ` - "-myarg"`?
    – ekkis
    Commented Mar 16, 2017 at 23:31
  • 3
    That depends totally on whatever program you're using to parse the YAML. This question is just about the YAML specification. Commented Mar 17, 2017 at 5:05
89

have you tried this?

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

I get this: [{"name"=>"Jack", "age"=>32}, {"name"=>"Claudia", "age"=>25}] (I use the YAML Ruby class).

0
22

If what you are needing is an array of arrays, you can do this way:

key:
  - [ 'value11', 'value12', 'value13' ]
  - [ 'value21', 'value22', 'value23' ]
2
  • 1
    Thanks Vinicius, but the question explicitly stated: ".I would like the ability to create a multi-line array", not multiple lines of multiple arrays.
    – Jimbo
    Commented Jun 2, 2020 at 7:04
  • 10
    didn't realize the question wasn't exactly mine, but came for this - thanks @Vinicius Commented Feb 17, 2021 at 11:58
10

The following would work:

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

I tested it using the snakeyaml implementation, I am not sure about other implementations though.

1
  • 2
    it worked with Puppet Enterprise 3.7 hiera yaml (Ruby yaml) one thing I find ruby yaml is quite sensitive too is the identation, and avoid using tabs. so example above should be like in two lines idented same number of spaces where first line is myarray: [String1, String2, String3, and second line is ` String4, String5, String5, String7 ] `
    – Walid
    Commented Jan 29, 2015 at 8:50
6

The following works for me and its good from readability point of view when the number of array element values is small:

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

This has been tested to work with snakeyaml and ruamel.yaml.

Not the answer you're looking for? Browse other questions tagged or ask your own question.