Baies multi-lignes YAML

140

Dans YAML , vous pouvez facilement créer des chaînes multilignes . Cependant, j'aimerais pouvoir créer un tableau multiligne (principalement pour la lisibilité dans les fichiers de configuration) en utilisant le |caractère.

Un YAML réseau peut être représentée comme suit: ['key1', 'key2', 'key3'].

Une séquence YAML utilise un tiret suivi d'un espace puis d'une chaîne:

- String1
- String2
- String3

Ce évaluerait à: ['string1', 'string2', 'string3'].

Un mappage YAML est un tableau de paires de clés et de valeurs que nous voyons tout le temps dans YAML:

Key1: string1
Key2: string2
Key3: string3

Tout cela est bien beau, mais je ne peux pas pour la vie de moi voir comment faire un tableau multiligne. Quelque chose comme ça:

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

À moins de créer plusieurs mappages de tableaux en YAML et de les fusionner dans le langage de programmation de mon choix, y a-t-il un moyen de réaliser des tableaux multi-lignes, peut-être avec { }comme Python mais en YAML?

Jimbo
la source
Honnêtement, qu'est-ce qu'un tableau multiligne et quand devrait-il avoir un sens? Plutôt que juste l'apparence de votre code
OK999
Avoir à faire défiler l'écran horizontalement pour voir toutes les options plutôt que de les voir toutes sur un seul écran à la fois.
Jimbo

Réponses:

241

Une séquence YAML est un tableau . Voici donc la bonne façon de l'exprimer:

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

C'est identique dans le sens à:

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

Il est également légal de diviser un tableau sur une seule ligne sur plusieurs lignes:

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

et même avoir des chaînes multilignes dans des tableaux sur une seule ligne:

key: ['string1', 'long
  string', 'string3', 'string4', 'string5', 'string6']
Steve Bennett
la source
1
est-ce un problème si les chaînes commencent par un - (par exemple les options passées dans la ligne de commande)? dois-je alors citer? `-" -myarg "`?
ekkis
2
Cela dépend totalement du programme que vous utilisez pour analyser le YAML. Cette question concerne uniquement la spécification YAML.
Steve Bennett
39

avez-vous essayé cela?

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

J'obtiens ceci: [{"name"=>"Jack", "age"=>32}, {"name"=>"Claudia", "age"=>25}](j'utilise la YAMLclasse Ruby).

Iwan B.
la source
6

Ce qui suit fonctionnerait:

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

Je l'ai testé en utilisant l'implémentation snakeyaml, mais je ne suis pas sûr des autres implémentations.

Oui
la source
2
cela a fonctionné avec Puppet Enterprise 3.7 hiera yaml (Ruby yaml) une chose que je trouve que ruby ​​yaml est assez sensible aussi est l'identification, et évite d'utiliser des onglets. donc l'exemple ci-dessus devrait être comme dans deux lignes identifiées le même nombre d'espaces où la première ligne est myarray: [String1, String2, String3,et la deuxième ligne est `String4, String5, String5, String7]`
Walid
2

La suite fonctionne pour moi et c'est bon du point de vue de la lisibilité lorsque les valeurs des éléments du tableau sont petites:

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

Remarque: implémentation snakeyaml utilisée

Harsimranjit Singh Kler
la source
0

Si vous avez besoin d'un tableau de tableaux, vous pouvez procéder de cette façon:

key:
  - [ 'value11', 'value12', 'value13' ]
  - [ 'value21', 'value22', 'value23' ]
Vinicius
la source
Merci Vinicius, mais la question énonçait explicitement: ". J'aimerais pouvoir créer un tableau multi-lignes", pas plusieurs lignes de plusieurs tableaux.
Jimbo le