Equivalente YAML de matriz de objetos en JSON
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
}
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>
Puedes verlo (y editarlo interactivamente) aquí .
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 .
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