YAML equivalente de una matriz de objetos en JSON

193

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

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

¿Hay 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
fuente

Respuestas:

367

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 una asignación, que se ve así:

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

Tenga en cuenta que los primeros caracteres de las teclas 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 estos (que son equivalentes):

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

En una secuencia de bloques, el -s debe 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 punto de trivia, YAML es un superconjunto de JSON, por lo que lo anterior ya es válido YAML, pero en realidad usemos las características de YAML para hacer esto más bonito.

Comenzando 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 los s y se alinean los primeros caracteres de las teclas de mapeo.

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:

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

Puedes verlo (y editarlo interactivamente) aquí .

Jordan Running
fuente
He actualizado mi pregunta para reflejar que hay varios elementos en la lista que contienen pares de acciones y fechas.
Wegry
3
@wegry: No hace la diferencia. Vea también el ejemplo del sitio web de YAML: yaml.org/start.html .
Felix Kling
5

Gran respuesta arriba. Otra forma es usar la gran herramienta de envoltura 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
fuente