Aprendizaje de la sintaxis de archivos YAML

I. Descripción general

YAML es un lenguaje de marcado similar a XML y JSON. YAML enfatiza estar centrado en datos en lugar de centrarse en el lenguaje de marcado. YAML es un lenguaje de serialización de datos más fácil de usar que se puede usar con la mayoría de los lenguajes de programación actuales.

La sintaxis de YAML es relativamente concisa e intuitiva. Se caracteriza por el uso de espacios para expresar estructuras jerárquicas. Su mayor ventaja radica en la expresión de estructuras de datos. Por lo tanto, YAML se usa más para escribir archivos de configuración. Sus archivos generalmente tienen .yamlsufijos .yml.

2. Funciones de sintaxis de YAML

  • Distingue mayúsculas y minúsculas
  • Utilice sangría para indicar relaciones jerárquicas
  • No se permiten tabulaciones para sangría, solo se permiten espacios (restricción de versión baja)
  • El número de espacios para la sangría no importa, siempre y cuando los elementos del mismo nivel estén alineados a la izquierda.
  • #Indica comentarios
  • Utilice la codificación Unicode como codificación estándar de caracteres, como UTF-8

3.YAML, XML, JSON

3.1, YAML a XML

语法:YAML 更加简洁易读,更适合人类阅读和编辑,而 XML 语法比较繁琐,更适合机器解析。

树形结构:XML 是基于树形结构的,需要显式地定义父子节点的关系,而 YAML 是基于缩进的,通过缩进表示层级关系,更加灵活。

扩展性:XML 有大量的标准和规范,可以很好地支持扩展,而 YAML 的扩展性相对较差。

应用场景:XML 更适合用于传输和存储结构化数据,如配置文件、文档等;YAML 更适合用于定义数据结构和对象序列化,如在编程语言中使用。

总的来说,YAML 更加人性化和灵活,XML 更加标准化和严谨,应根据具体应用场景选择使用。

3.2 YAML y JSON

  • JSON puede considerarse como un subconjunto de YAML, lo que significa que lo que JSON puede hacer, YAML también lo puede hacer.
  • YAML puede expresar cosas de forma más sencilla y legible que JSON, como "las cadenas no necesitan comillas". Por lo tanto, YAML se puede escribir fácilmente en formato JSON, pero no se recomienda.
  • YAML puede describir estructuras más complejas que JSON. Por ejemplo, los "anclajes de relación" pueden representar referencias de datos (como referencias a datos repetidos).

YAML y JSON son formatos de serialización de datos de uso común y tienen las siguientes comparaciones:

语法:YAML 语法相对于 JSON 更加简洁易读,更适合人类阅读和编辑,而 JSON 语法更加紧凑,更适合机器解析。

树形结构:JSON 和 XML 一样,是基于树形结构的,需要显式地定义父子节点的关系,而 YAML 是基于缩进的,通过缩进表示层级关系。

扩展性:JSON 的扩展性相对较好,支持各种数据类型,可用于序列化复杂数据结构,而 YAML 的扩展性相对较差。

应用场景:JSON 更适合用于 Web 应用中,如 Ajax 或 RESTful API,因为它更加轻量级和易于处理;YAML 更适合用于配置文件和数据序列化,如在编程语言中使用。

总的来说,YAML 更加人性化和易读,JSON 更加紧凑和高效,应根据具体应用场景选择使用。

4. Tipos de datos admitidos por yaml

  • escalar: un valor único e indivisible
  • Objeto: una colección de pares clave-valor, también conocida como mapeo/hash/diccionario
  • Matriz: un conjunto de valores ordenados, también llamado secuencia/lista

4.1 Objeto

Es decir, pares clave-valor.key: value

  • El par clave-valor del objeto está representado por una estructura de dos puntos key: valuey se debe agregar un espacio después de los dos puntos.
  • También puede ser usadokey:{key1: value1, key2: value2, ...}
  • También puede utilizar sangría para indicar relaciones jerárquicas.
  • Para formatos de objetos más complejos, puede utilizar un signo de interrogación más un espacio para representar una clave compleja y dos puntos más un espacio para representar un valor,
    de la siguiente manera:
name: "Jahn"
age: 21

# 行内对象,即使用{}写成一行,在 YAML 1.0 中,流式风格被称为“非文档流式”,但是在 1.1 版本中更名为“流式”,并进行了更新。在 YAML 1.2 中,流式风格得到了进一步的改进和扩展。
info: {
    
    name: "Jahn", age: 21}

# 缩进表示层级关系
info: 
    name: "Jahn"
    age: 21

# 较为复杂的对象格式,可以使用问号加一个空格代表一个复杂的 key,配合一个冒号加一个空格代表一个 value
?
    -complexkey1
    - complexkey2
:
    - complexvalue1
    - complexvalue2

# 意思即对象的属性是一个数组 [complexkey1,complexkey2],对应的值也是一个数组 [complexvalue1,complexvalue2]

4.2 Matriz

Un conjunto de valores ordenados, también conocido como secuencia/lista, tiene la siguiente forma centralizada:

  • Un conjunto de datos que comienza con formato de bloque (es decir,) forma una matriz“破折号+空格”
animals:
  - Cat
  - Dog
  - Goldfish

{
    
     animals: [ 'Cat', 'Dog', 'Goldfish' ] }
  • También admite formato en línea (formato en línea) para expresión (entre corchetes, separados por comas y espacios, similar a JSON)
values: [value1, value2, value3]

{
    
     values: [ 'value1', 'value2', 'value3' ] }
  • Admite matrices multidimensionales (use sangría para indicar relaciones jerárquicas)
values:
  -        # 数据结构的子成员是一个数组,则可以在该项下面缩进一个空格。
    - value1
    - value2
  -
    - value3
    - value4

{
    
     values: [ [ 'value1', 'value2' ], [ 'value3', 'value4' ] ] }

Tenga en cuenta que no puede agregar nada a las líneas 2 y 5; de lo contrario, no será una matriz bidimensional después del análisis, como se muestra en el siguiente contraejemplo.

values:
  - sx1
    - value1
    - value2
  - sx2
    - value3
    - value4

{
    
     values: [ 'sx1 - value1 - value2', 'sx2 - value3 - value4' ] }

4.3 Estructura compuesta

Los objetos y matrices se pueden combinar para formar estructuras compuestas.

sport:
 - swim
 - run
 - basketball

city:
 haidian: beijing.haidian
 jinan: shandong.jinan
 hefei: anhui.hefei

4.4 Cantidad escalar

Una cantidad escalar es el valor más básico e indivisible.

字符串
布尔值
整数
浮点数
Null
时间
日期

Los ejemplos son los siguientes:

boolean: 
    - TRUE  # true,True都可以
    - FALSE  # false,False都可以
float:
    - 3.14
    - 6.8523015e+5  # 可以使用科学计数法
int:
    - 123
    - 0b1010_0111_0100_1010_1110    # 二进制表示
null:
    nodeName: 'node'
    parent: ~  # 使用~表示null
string:
    - 哈哈
    - 'Hello world'  # 可以使用双引号或者单引号包裹特殊字符
    - newline
      newline2    # 字符串可以拆成多行,每一行会被转化成一个空格
date:
    - 2018-02-17    # 日期必须使用ISO 8601格式,即yyyy-MM-dd
datetime: 
    -  2018-02-17T15:02:31+08:00    # 时间使用ISO 8601格式,时间和日期之间使用T连接,最后使用+代表时区

4.4.1 Cadena

  • Por lo general, las cadenas no necesitan estar entre comillas, pero si se usa el carácter de escape al comienzo de la barra invertida en la cadena, “\”debe estar entre comillas.
strings:
  - Hello without quote        # 不用引号包裹
  - Hello
    world                      # 拆成多行后会自动在中间添加空格
  - 'Hello with single quotes' # 单引号包裹
  - "Hello with double quotes" # 双引号包裹
  - "I am fine. \u263A"        # 使用双引号包裹时支持 Unicode 编码
  - "\x0d\x0a is \r\n"         # 使用双引号包裹时还支持 Hex 编码
  - 'He said: "Hello!"'        # 单双引号支持嵌套"
  - \n \r             
  - '\n \r'                    
  - "\n \r"                    

Su JSON es el siguiente:

{
    
     strings: 
   [ 'Hello without quote',
     'Hello world',
     'Hello with single quotes',
     'Hello with double quotes',
     'I am fine. ☺',
     '\r\n is \r\n',
     'He said: "Hello!"',
     '\\n \\r',
     '\\n \\r',
     '\n \r' ] }
  • Para texto de varias líneas, YAML proporciona dos soportes de sintaxis especiales.

    • Nuevas líneas preservadas

    Utilice el carácter de barra vertical |para representar esta sintaxis. Se eliminarán la sangría y los espacios en blanco finales de cada línea, y se conservará la sangría adicional.

    lines: |
    我是第一行
    我是第二行
        我是吴彦祖
        我是第四行
    我是第五行
    

    El formato JSON es el siguiente:

    {
          
           lines: '我是第一行\n我是第二行\n  我是吴彦祖\n    我是第四行\n我是第五行\n' }
    
    • Nuevas líneas dobladas

    Utilice el corchete en ángulo recto >para indicar esta sintaxis; solo las líneas en blanco se reconocerán como nuevas líneas y las nuevas líneas originales se convertirán en espacios.

    lines: >
    我是第一行
    我也是第一行
    我仍是第一行
    我依旧是第一行
    
    我是第二行
    这么巧我也是第二行
    

    Su formato JSON es el siguiente:

    {
          
           lines: '我是第一行 我也是第一行 我仍是第一行 我依旧是第一行\n我是第二行 这么巧我也是第二行\n' }
    

    Tenga en cuenta que se reconocerá el carácter de nueva línea al final de la última línea de este método.

    • También puede usar + y - para elegir si desea conservar el carácter de nueva línea al final del bloque de texto.

      +Indica mantener la nueva línea al final del bloque de texto y -eliminar la nueva línea al final de la cadena.

    s1: |
    Foo
    s2: |+
    Foo
    s3: |-
    Foo
    

    Su JSON es el siguiente:

    {
          
           s1: 'Foo\n', s2: 'Foo\n', s3: 'Foo' }
    

4.4.2 Valor booleano

  • "true"、"True"、"TRUE"、"yes"、"Yes"和"YES"todo es verdad
  • "false"、"False"、"FALSE"、"no"、"No"和"NO"todo falso
boolean:
  - True
  - true
  - False
  - FALSE

4.4.3 Entero

Soporta representación binaria

int:
  - 666    # 十进制
  - 0b10   # 0b 前缀,二进制
  - 010    # 0 前缀,八进制
  - 0x10   # 0x 前缀,十六进制

4.4.4 Números de coma flotante

Soporte de notación científica.

float:
  - 3.14
  - 6.8523015e+5  # 指数必须是整数
  - 6E3

4.4.5 Valor nulo

nulls:
  - 
  - null
  - Null
  - NULL
  - ~

4.4.6 Tiempo

La hora está en formato ISO8601.

iso8601: 2001-12-14t21:59:43.10-05:00

4.4.7 Fecha

La fecha está representada por año, mes y día en formato ISO8601.

date: 1976-07-31

4.5 Conversión de tipo

YAML admite el uso de etiquetas de tipo estrictas !!(双感叹号+目标类型)para coaccionar tipos. Los siguientes son los tipos integrados

símbolo significado
!!int tipo entero
!!float tipo de punto flotante
!!bool tipo booleano
!!str tipo de cadena
!!binary También un tipo de cadena
!!timestamp tipo de fecha y hora
!!null valor nulo
!!set recolectar
!!omap,!!pairs Lista de valores clave o lista de objetos
!!seq Secuencia, también una lista.
!!map tabla de valores clave
a: !!float '666' # !! 为严格类型标签
b: '666' # 其实双引号也算是类型转换符
c: !!str 666 # 整数转为字符串
d: !!str 666.66 # 浮点数转为字符串
e: !!str true # 布尔值转为字符串
f: !!str yes # 布尔值转为字符串

4.6 Cotización

Para mantener el contenido conciso y evitar demasiadas definiciones repetidas, YAML proporciona una sintaxis que consta de etiquetas de anclaje "&"y etiquetas de referencia . Este conjunto de sintaxis se puede utilizar para hacer referencia rápidamente a los mismos datos."*"

a: &anchor # 设置锚点
  one: 1
  two: 2
  three: 3
b: *anchor # 引用锚点

# 锚点必须加在冒号后,值之前,然后用*符号可以解引用

4.7 Fusión

Se puede combinar con cualquier dato cuando se usa con la etiqueta de combinación "<<". Puede considerar este conjunto de operaciones como herencia en lenguajes orientados a objetos.

human: &base # 添加名为 base 的锚点
    body: 1
    hair: 999
singer:
    <<: *base # 引用 base 锚点,实例化时会自动展开
    skill: sing # 添加额外的属性
programer:
    <<: *base # 引用 base 锚点,实例化时会自动展开
    hair: 6 # 覆写 base 中的属性
    skill: code # 添加额外的属性

Se puede entender comparando su valor jaon:

{
    
     human: {
    
     body: 1, hair: 999 },
  singer: {
    
     body: 1, hair: 999, skill: 'sing' },
  programer: {
    
     body: 1, hair: 6, skill: 'code' } }

Documentación de referencia

1. https://blog.csdn.net/dreaming_coder/article/details/106973969

2. https://blog.csdn.net/qq_25447799/article/details/120319542

3. https://blog.csdn.net/weixin_43340943/article/details/105953673

4. https://www.cnblogs.com/yxfeng/p/10396288.html

Supongo que te gusta

Origin blog.csdn.net/yuelai_217/article/details/130582142
Recomendado
Clasificación