Matrici multilinea YAML


140

In YAML , puoi facilmente creare stringhe multilinea . Tuttavia, vorrei la possibilità di creare un array multilinea (principalmente per la leggibilità all'interno dei file di configurazione) usando il |personaggio.

Un YAML matrice può essere rappresentata come: ['key1', 'key2', 'key3'].

Una sequenza YAML utilizza un trattino seguito da uno spazio e quindi una stringa:

- String1
- String2
- String3

Ciò sarebbe valutato come: ['string1', 'string2', 'string3'].

Una mappatura YAML è una matrice di coppie chiave e valore che vediamo continuamente in YAML:

Key1: string1
Key2: string2
Key3: string3

Va tutto bene, ma per la vita non riesco a vedere come fare un array multi-linea. Qualcosa come questo:

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

A meno di creare più mapping di array in YAML e di unirli nel mio linguaggio di programmazione preferito, esiste un modo per ottenere array multi-linea, magari con { }come Python ha ma in YAML?


onestamente, qual è un array multilinea e quando dovrebbe essere significativo? Piuttosto che solo l'aspetto del tuo codice
OK999

Dover scorrere lo schermo in orizzontale per vedere tutte le opzioni invece di vederle tutte una schermata alla volta.
Jimbo,

Risposte:


241

Una sequenza YAML è un array . Quindi questo è il modo giusto per esprimerlo:

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

È identico nel significato di:

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

È anche legale dividere un array a riga singola su più righe:

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

e hanno persino stringhe a più righe negli array a riga singola:

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

1
è un problema se le stringhe iniziano con un - (ad es. opzioni passate nella riga di comando)? devo quindi citare? `-" -myarg "`?
ekkis,

2
Dipende totalmente dal programma che stai utilizzando per analizzare lo YAML. Questa domanda riguarda solo le specifiche YAML.
Steve Bennett,

39

hai provato questo?

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

Ottengo questo: [{"name"=>"Jack", "age"=>32}, {"name"=>"Claudia", "age"=>25}](io uso la YAMLclasse Ruby).


6

Quanto segue funzionerebbe:

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

L'ho provato usando l'implementazione di snakeyaml, ma non sono sicuro di altre implementazioni.


2
ha funzionato con Puppet Enterprise 3.7 hiera yaml (Ruby yaml) una cosa che trovo ruby ​​yaml è abbastanza sensibile anche l'identificazione, ed evito di usare le schede. quindi l'esempio sopra dovrebbe essere come in due righe identificate con lo stesso numero di spazi in cui la prima riga è myarray: [String1, String2, String3,e la seconda riga è `String4, String5, String5, String7]`
Walid

2

Seguire Works per me e va bene dal punto di vista della leggibilità quando i valori degli elementi dell'array sono piccoli:

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

Nota: implementazione snakeyaml utilizzata


0

Se ciò di cui hai bisogno è una matrice di array, puoi fare in questo modo:

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

Grazie Vinicio, ma la domanda affermava esplicitamente: "Vorrei la possibilità di creare un array multi-linea", non più linee di più array.
Jimbo,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.