Tratando de convertir el archivo about yml a json. Cuando intento hacerlo, omite &, <<, *. He intentado un montón de cosas pero no parece crear json como esperaba.

Estoy tratando de usar el nodo para convertir yaml a json y viceversa.

development-mysql: &development-mysql
  pool: 5
  encoding: utf8
  host: 127.0.0.1
  port: 1234

alpha: &alpha
  <<: *development-mysql
  adapter: oracle
  database: testDB
  username: test
  time_zone: UTC

Se convierte a

{
  "development-mysql": {
    "pool": 5,
    "encoding": "utf8",
    "host": "127.0.0.1",
    "port": 1234
  },
  "alpha": {
    "pool": 5,
    "encoding": "utf8",
    "host": "127.0.0.1",
    "port": 1234,
    "adapter": "oracle",
    "database": "testDB",
    "username": "test",
    "time_zone": "UTC"
  }
}

Que cuando trato de convertirlo de nuevo a yml es así

development-mysql:
    pool: 5
    encoding: utf8
    host: 127.0.0.1
    port: 1234
alpha:
    pool: 5
    encoding: utf8
    host: 127.0.0.1
    port: 1234
    adapter: oracle
    database: testDB
    username: test
    time_zone: UTC

Ahora, en teoría, esto es correcto, pero perdimos la capacidad de <<, * y &. Cualquier forma de tener json con toda la capacidad retenida y convertirlo de nuevo a yml

0
Praveen 25 oct. 2019 a las 00:08

1 respuesta

La mejor respuesta

Cuando usa anclas y alias (& / *) o la clave de combinación (<<) que ni siquiera está definida en la especificación YAML, pero como extensión opcional, está utilizando funciones que simplemente no existen en JSON.

El tipo de clave de combinación (<<) se define incluso como combinación de las asignaciones, lo que significa que si carga un documento con esta función, incluso si lo escribe como YAML, obtendrá el mapa combinado impreso porque se procesa mientras se carga el documento. Solo puede eludir esto utilizando una implementación que en realidad no procese la clave de combinación (no todos lo hacen).

Con anclas y alias, la simple verdad es que JSON no ofrece nada parecido. Eso significa que si serializa un valor en JSON donde se hace referencia a cualquier subnodo varias veces, la implementación de JSON no tiene más remedio que copiar el valor.

Ahora, por supuesto, hay un remedio. Ese remedio sería serializar la estructura (en lugar del valor construido) de la entrada YAML como JSON. Echemos un vistazo a este sencillo ejemplo de YAML:

- &a foo
- *a

El JSON resultante podría verse así:

{
  "type": "sequence",
  "items": [
    {
      "type": "scalar",
      "anchor": "a",
      "value": "foo"
    }, {
      "type": "alias",
      "target": "a"
    }
  ]
}

Esta representación JSON conserva toda la información del archivo YAML original y, por lo tanto, la entrada YAML se puede reconstruir a partir de él. Pero el JSON se llena bastante ya que necesitamos codificar la información estructural de la entrada YAML en objetos. La pregunta es si el JSON es útil para cualquier cosa que intente hacer con él.

Si este es un enfoque factible, deberá implementarlo. Primero necesita una implementación de YAML que le dé acceso al árbol de eventos de bajo nivel según las especificaciones de YAML (no todos lo hacen), vea este diagrama:

Lo que se denomina árbol de eventos es, en la mayoría de las implementaciones, en realidad una lista de eventos, que consta de eventos como StartSequence , EndSequence , etc. para escribir código para codificar esta lista en JSON y también codificar para decodificar el JSON de nuevo a la lista, que luego puede volver a introducir en la implementación de YAML para obtener el resultado que desee.

Ahora bien, lo más probable es que esto sea demasiado esfuerzo para lo que realmente quiere hacer. Le recomiendo encarecidamente no hacer esto y encontrar una manera de lidiar con cualquier problema que esté resolviendo sin convertir YAML a JSON mientras se requiere que conserve las características de YAML que faltan en JSON.

0
flyx 24 oct. 2019 a las 21:48