Rompiendo cadenas YAML en varias líneas

1. Información general

En este artículo, aprenderemos a romper cadenas YAML en varias líneas.

Para analizar y probar nuestros archivos YAML, usaremos la biblioteca SnakeYAML.

2. Cadenas de varias líneas

Antes de comenzar, creemos un método para simplemente leer una clave YAML de un archivo en una cadena :

String parseYamlKey(String fileName, String key) { InputStream inputStream = this.getClass() .getClassLoader() .getResourceAsStream(fileName); Map parsed = yaml.load(inputStream); return parsed.get(key); }

En las siguientes subsecciones, veremos algunas estrategias para dividir cadenas en varias líneas.

También aprenderemos cómo YAML maneja los saltos de línea iniciales y finales representados por líneas vacías al principio y al final de un bloque.

3. Estilo literal

El operador literal está representado por el símbolo de barra vertical ("|"). Mantiene nuestros saltos de línea pero reduce las líneas vacías al final de la cadena a un solo salto de línea.

Echemos un vistazo al archivo YAML literal.yaml :

key: | Line1 Line2 Line3

Podemos ver que nuestros saltos de línea se conservan:

String key = parseYamlKey("literal.yaml", "key"); assertEquals("Line1\nLine2\nLine3", key);

A continuación, echemos un vistazo a literal2.yaml , que tiene algunos saltos de línea iniciales y finales:

key: | Line1 Line2 Line3 ...

Podemos ver que todos los saltos de línea están presentes excepto los saltos de línea finales, que se reducen a uno:

String key = parseYamlKey("literal2.yaml", "key"); assertEquals("\n\nLine1\n\nLine2\n\nLine3\n", key);

A continuación, hablaremos sobre la masticación de bloques y cómo nos da más control sobre los saltos de línea inicial y final.

Podemos cambiar el comportamiento predeterminado usando dos métodos de masticación: keep y strip .

3.1. Mantener

Keep está representado por "+" como podemos ver en literal_keep.yaml :

key: |+ Line1 Line2 Line3 ...

Al anular el comportamiento predeterminado, podemos ver que cada línea final vacía se mantiene :

String key = parseYamlKey("literal_keep.yaml", "key"); assertEquals("Line1\nLine2\nLine3\n\n", key);

3.2. Tira

La tira está representada por "-" como podemos ver en literal_strip.yaml :

key: |- Line1 Line2 Line3 ...

Como podríamos haber esperado, esto da como resultado la eliminación de todas las líneas vacías finales :

String key = parseYamlKey("literal_strip.yaml", "key"); assertEquals("Line1\nLine2\nLine3", key);

4. Estilo doblado

El operador plegado está representado por ">" como podemos ver en folded.yaml :

key: > Line1 Line2 Line3

De forma predeterminada, los saltos de línea se reemplazan por caracteres de espacio para líneas consecutivas no vacías:

String key = parseYamlKey("folded.yaml", "key"); assertEquals("Line1 Line2 Line3", key);

Veamos un archivo similar, folded2.yaml , que tiene algunas líneas vacías finales:

key: > Line1 Line2 Line3 ...

Podemos ver que las líneas vacías se conservan, pero los saltos de línea finales también se reducen a uno :

String key = parseYamlKey("folded2.yaml", "key"); assertEquals("Line1 Line2\n\nLine3\n", key);

Debemos tener en cuenta que el mordisco de bloques afecta al estilo de plegado de la misma manera que afecta al estilo literal .

5. Cotización

Echemos un vistazo rápido a la división de cadenas con la ayuda de comillas simples y dobles.

5.1. Doble comillas

Con comillas dobles, podemos crear fácilmente cadenas de varias líneas usando " \ n ":

key: "Line1\nLine2\nLine3"
String key = parseYamlKey("plain_double_quotes.yaml", "key"); assertEquals("Line1\nLine2\nLine3", key);

5.2. Comillas simples

Por otro lado, las comillas simples tratan “ \ n ” como parte de la cadena, por lo que la única forma de insertar un salto de línea es usando una línea vacía:

key: 'Line1\nLine2 Line3'
String key = parseYamlKey("plain_single_quotes.yaml", "key"); assertEquals("Line1\\nLine2\nLine3", key);

6. Conclusión

En este tutorial rápido, hemos examinado varias formas de romper cadenas YAML en varias líneas a través de ejemplos rápidos y prácticos.

Como siempre, el código está disponible en GitHub.