Equivalente YAML de matriz de objetos en JSON

Resuelto wegry asked hace 8 años • 3 respuestas

Tengo una matriz JSON de objetos que estoy intentando convertir a YAML.

{"AAPL": [
  {
    "shares": -75.088,
    "date": "11/27/2015"
  },
  {
    "shares": 75.088,
    "date": "11/26/2015"
  },
]}

¿Existe una representación equivalente en YAML que no sea solo JSON? Me gustaría hacer algo como

AAPL:
  - :
    shares: -75.088
    date: 11/27/2015
  - :
    shares: 75.088
    date: 11/26/2015

pero lo más limpio que se me ocurrió es

AAPL:
  - {
    shares: -75.088,
    date: 11/27/2015
  }
  {
    shares: 75.088,
    date: 11/26/2015
  }
wegry avatar Nov 30 '15 06:11 wegry
Aceptado

TL;DR

Tu quieres esto:

AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015

Mapeos

El equivalente YAML de un objeto JSON es un mapeo, que se parece a esto:

# flow style
{ foo: 1, bar: 2 }
# block style
foo: 1
bar: 2

Tenga en cuenta que los primeros caracteres de las claves en una asignación de bloques deben estar en la misma columna. Demostrar:

# OK
   foo: 1
   bar: 2
# Parse error
   foo: 1
    bar: 2

Secuencias

El equivalente de una matriz JSON en YAML es una secuencia que se parece a cualquiera de estas (que son equivalentes):

# flow style
[ foo bar, baz ]
# block style
- foo bar
- baz

En una secuencia de bloques, los -s deben estar en la misma columna.

JSON a YAML

Convirtamos tu JSON en YAML. Aquí está tu JSON:

{"AAPL": [
  {
    "shares": -75.088,
    "date": "11/27/2015"
  },
  {
    "shares": 75.088,
    "date": "11/26/2015"
  },
]}

Como curiosidad, YAML es un superconjunto de JSON, por lo que lo anterior ya es YAML válido, pero usemos las características de YAML para hacerlo más bonito.

Empezando de adentro hacia afuera, tenemos objetos que se ven así:

{
  "shares": -75.088,
  "date": "11/27/2015"
}

El mapeo YAML equivalente es:

shares: -75.088
date: 11/27/2015

Tenemos dos de estos en una matriz (secuencia):

- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015

Observe cómo -se alinean las s y los primeros caracteres de las claves de asignación.

Finalmente, esta secuencia es en sí misma un valor en un mapeo con la clave AAPL:

AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015

Analizar esto y convertirlo nuevamente a JSON produce el resultado esperado:

console.log(jsyaml.load(`
AAPL:
  - shares: -75.088
    date: 11/27/2015
  - shares: 75.088
    date: 11/26/2015
`));
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-yaml/4.1.0/js-yaml.min.js"></script>
Expandir fragmento

Puedes verlo (y editarlo interactivamente) aquí .

Jordan Running avatar Nov 30 '2015 00:11 Jordan Running

Para complementar la respuesta aceptada si le molesta el espacio reducido, también puede hacer:

AAPL:
  - 
    shares: -75.088
    date: 11/27/2015
  - 
    shares: 75.088
    date: 11/26/2015

...esto está adaptado directamente del ejemplo 2.4 "Secuencia de asignaciones" de la especificación YAML .

ChalkTalk avatar Jun 05 '2021 00:06 ChalkTalk

Gran respuesta arriba. Otra forma es utilizar la excelente herramienta contenedora yaml jq, yq en https://github.com/kislyuk/yq

Guarde su ejemplo JSON en un archivo, diga ex.json y luego

yq -y '.' ex.json

AAPL:
- shares: -75.088
  date: 11/27/2015
- shares: 75.088
  date: 11/26/2015
Jon Scobie avatar Oct 24 '2018 19:10 Jon Scobie