Español

Qué hacen los convertidores de sintaxis

JSON, YAML, XML, TOML y CSV no contienen lo mismo. Esta página indica exactamente cómo se asigna cada forma, qué conversiones generan pérdidas y qué se niega a hacer la herramienta.

lo que convierte

Nueve conversiones dirigidas: JSON a YAML, YAML a JSON, JSON a XML, XML a JSON, JSON a TOML, TOML a JSON, YAML a TOML, TOML a YAML y JSON a CSV. Cada uno se ejecuta en la pestaña de su navegador; no se sube nada.

Cada conversión funciona de la misma manera internamente: el documento fuente se lee en un valor JavaScript normal y ese valor se escribe en el formato de destino. YAML a TOML no es un caso especial, es el lector YAML seguido del escritor TOML. Es por eso que las advertencias a continuación se indican por formato en lugar de por par; una advertencia sobre las fechas y horas de TOML se aplica dondequiera que aparezca TOML.

CSV es de solo escritura y lo es deliberadamente. Leer CSV significa adivinar un delimitador, un dialecto de comillas, si la primera fila es un encabezado y un tipo para cada celda: cuatro conjeturas, en cada una de las cuales un convertidor se equivoca silenciosamente. Ese es un trabajo para una herramienta que pregunta.

XML: atributos, matrices y las reglas que elegimos

XML no tiene mapeo JSON canónico, por lo que se tuvieron que elegir las convenciones. Son visibles en pantalla siempre que XML sea uno de los dos formatos, y son estos.

Los atributos se convierten en claves de objeto con el prefijo @. <user id="7"><name>Ada</name></user> se lee como {"user":{"@id":"7","name":"Ada"}}. El prefijo es lo que evita que un atributo y un elemento secundario del mismo nombre colapsen en una clave: <user id="7"><id>other</id></user> mantiene ambos.

El texto dentro de un elemento que también tiene atributos o elementos secundarios se encuentra bajo la clave #texto. Un elemento que no contiene nada más que texto se colapsa en ese texto. Una sección CDATA se encuentra bajo #cdata, por lo que su contenido es visiblemente datos en lugar de marcas.

Los elementos hermanos repetidos se convierten en una matriz. Un nombre de elemento que aparece una vez no se convierte en una matriz: XML no le da al analizador ninguna forma de distinguir "una lista con un elemento" de "un valor único", y ningún convertidor puede inventar esa información. Si necesita una forma estable, ese es un argumento a favor de un esquema, no a favor de un convertidor más inteligente.

Los prefijos de espacio de nombres se mantienen palabra por palabra: <ns:item> es la clave ns:item y xmlns:ns es el atributo @xmlns:ns. No se resuelve, reescribe ni elimina nada, porque al resolver un prefijo se desecha el texto que realmente contenía el documento.

Una etiqueta de cierre automático se lee como una cadena vacía. Se eliminan la declaración XML, las instrucciones de procesamiento y los comentarios. Por el contrario, la herramienta escribe su propia declaración y nunca un DOCTYPE.

Escribir XML, una clave que no es un nombre de elemento XML legal (una con un espacio, otra que comienza con un dígito, otra que comienza con las letras xml) se rechaza por nombre en lugar de reescribirse silenciosamente. Un elemento renombrado silenciosamente produce un documento que no se valida contra nada.

Las entidades externas son rechazadas, no simplemente inhabilitadas

Un documento XML puede declarar entidades en un DOCTYPE. Un analizador que los expande es la vulnerabilidad XXE: una entidad declarada SISTEMA "file:///etc/passwd" lee un archivo local, una que apunta a una URL realiza una solicitud que un atacante controla, y una cadena de entidades internas es la denegación de servicio de "mil millones de risas" que convierte unos cientos de bytes en gigabytes.

Este convertidor no configura un analizador para que tenga cuidado con los DOCTYPE. Rechaza cualquier documento que contenga uno, antes de que el analizador reciba un solo byte, sin opción de desactivar el rechazo. Eso hace que la garantía sea una propiedad de nuestro código en lugar de la configuración predeterminada de una dependencia, y la diferencia es importante, porque los valores predeterminados cambian entre versiones y nuestro propio rechazo está cubierto por pruebas que le suministran cada carga útil XXE estándar y afirman que no se obtuvo nada ni se expandió nada.

El costo práctico: un documento con DOCTYPE no se convertirá aquí incluso cuando sea inofensivo. Elimina el DOCTYPE si el contenido es tuyo.

Las fechas y horas de TOML no tienen equivalente en ningún otro lugar

TOML 1.0 tiene cuatro tipos temporales y JSON, YAML y XML no tienen ninguno: compensación de fecha y hora (1979-05-27T07:32:00Z), local fecha-hora (1979-05-27T07:32:00, sin zona, deliberadamente), fecha local (1979-05-27) y hora local (07:32:00).

Cada uno se convierte en la cadena RFC 3339 exactamente como fue escrito, y la conversión le indica a qué valores lo hizo y cuál de los cuatro tipos era cada uno. La alternativa (emitir un único instante UTC para los cuatro) movería una hora local a una zona que el documento se negó explícitamente a indicar, lo cual es una respuesta incorrecta y no con pérdidas.

La conversión inversa produce cadenas entrecomilladas, no fechas y horas. Por lo tanto, un viaje de ida y vuelta de TOML a JSON a TOML cambia los tipos de esos valores. No hay forma de evitar esto sin inventar una convención que la herramienta receptora tendría que compartir, e inventar una en silencio sería peor.

TOML los enteros están firmados 64-bit; Los números JSON son dobles IEEE-754. Un número entero posterior a 2^53 - 1 se convierte en una cadena, con la ruta nombrada en una advertencia, en lugar de perder sus últimos dígitos por un redondeo que no notarás.

TOML no tiene ningún valor nulo. Una clave nula se omite en la salida y se nombra en una advertencia; un valor nulo dentro de una matriz se convierte en una cadena vacía, porque eliminarlo cambiaría cada índice posterior. La raíz de un documento TOML es siempre una tabla, por lo que una matriz o un valor básico en la raíz se rechaza con una oración que diga por qué.

YAML: anclas, arroyos y el problema de Noruega

YAML se lee con un esquema restringido que solo puede producir cadenas, números, valores booleanos, nulos, listas y mapas. Las etiquetas que construyen objetos arbitrarios (!!js/function, !!python/object/apply, !!binary) se rechazan, razón por la cual existe la restricción: un cargador que las respeta es un constructor de objetos arbitrarios que viste la ropa de un archivo de configuración.

Los anclajes y alias se resuelven en datos repetidos. Un documento que se expande más allá de un millón de valores una vez que se siguen sus alias se rechaza en lugar de permitir que se congele la pestaña; un alias recursivo se rechaza de plano, porque ningún otro formato aquí puede expresar un ciclo.

Un flujo de varios documentos separados por --- se convierte en una serie de documentos, y la conversión así lo dice. Ningún otro formato en esta herramienta tiene una secuencia, por lo que una matriz es el único mapeo honesto.

YAML prohíbe una clave de mapeo repetida y cada analizador maneja una de manera diferente. Esta herramienta mantiene el último valor (la regla que usa JSON.parse) y le indica lo que sucedió, con la posición de la repetición. Desechar un documento en silencio sería peor; Elegir un valor en silencio sin decirlo sería aún peor.

El problema de Noruega: en YAML 1.1, los escalares sin comillas y, sí, encendido, no, apagado y el código de país NO se resuelven en booleanos, que es como una lista de códigos de país se convierte en una lista de verdaderos y falsos. Esta herramienta lee YAML 1.2, donde solo verdadero y falso son booleanos, por lo que NO permanece como cadena NO. Cuando escribe YAML, cita cada cadena que un analizador 1.1 leería mal: 'NO', 'yes', 'on', '1.0', '0755', '2001-12-14', por lo que es seguro enviar la salida a una herramienta. que no se ha movido a 1.2. Eso cuesta unas pocas comillas y compra corrección.

Las cadenas que parecen números mantienen sus comillas por la misma razón: "0755" sigue siendo una cadena en lugar de convertirse en 755, y "1.0" sigue siendo una cadena en lugar de convertirse en 1.

Los comentarios se pierden en todas direcciones. JSON, CSV y los demás no tienen dónde colocarlos y no hay forma de adivinar dónde deberían ir al regresar.

JSON a CSV: aplanamiento y el apóstrofe que detiene una fórmula

Una matriz se convierte en filas, un registro por elemento. Un objeto cuya propiedad única contiene una matriz usa esa matriz como filas, porque {"users": [...]} es abrumadoramente una tabla con una etiqueta, y la conversión dice en voz alta que hizo eso. Cualquier otro objeto es una sola fila. Se rechaza una cadena simple, un número o un valor nulo: un rectángulo necesita registros.

Los objetos y matrices anidados se aplanan en nombres de columnas con puntos, con un punto tanto para las claves de objeto como para los índices de matriz: dirección.ciudad, etiquetas.0, etiquetas.1. Un separador, una regla. Una clave que ya contiene un punto hace que el nombre de su columna sea ambiguo con una ruta anidada; la herramienta advierte en lugar de inventar un esquema de escape que ninguna hoja de cálculo entendería.

Las claves están unidas en cada fila, en el orden en que se ven por primera vez. A una fila a la que le falta un campo obtiene una celda vacía en lugar de una columna desplazada, y la conversión advierte que las filas estaban irregulares. Un objeto vacío o una matriz vacía se convierte en una celda vacía según su propio camino en lugar de desaparecer.

Las comillas siguen el RFC 4180: un campo que contiene el delimitador, una comilla doble, CR o LF se incluye entre comillas dobles y una comilla incrustada se escribe dos veces. Los registros están separados por CRLF. Los campos con espacios en blanco al principio o al final también se citan, porque de lo contrario las hojas de cálculo los recortan silenciosamente. Unicode pasa sin cambios y se puede anteponer una marca de orden de bytes para las hojas de cálculo que necesitan una para leer UTF-8.

La fórmula inyectable es la que muerde. Una celda que comienza con =, +, -, @, una tabulación o un retorno de carro se ejecuta como fórmula en Excel, LibreOffice Calc y Google Sheets en el momento en que se abre el archivo. =cmd|'/c calc'!A1 es la demostración que todos citan; =IMPORTXML(...) es el que silenciosamente envía la hoja a alguna parte. Un convertidor que escribe una cadena de este tipo palabra por palabra ha convertido sus datos en la ejecución del código de otra persona, en un archivo que parece inerte.

Por lo tanto, una celda de texto que comienza con uno de esos caracteres tiene como prefijo un apóstrofe, que en todas las hojas de cálculo principales se lee "esto es texto" y no se muestra en la celda. Los números se dejan en paz: un numérico -5 es un número, no una fórmula. Se informa el recuento de celdas que se escaparon y se puede desactivar el escape, en cuyo caso la herramienta dice claramente lo que acaba de desactivar.

CSV no puede distinguir una cadena vacía de una nula. Ambas se convierten en una celda vacía y la conversión cuenta los valores nulos para que sepas lo que sucedió.

Límites y qué sucede cuando alcanzas uno

Cada formato tiene un límite de caracteres, que se aplica incluso antes de descargar un analizador: 8 millones para JSON, 4 millones para XML y para una fuente CSV, 2 millones para YAML y TOML. Más allá de eso, la herramienta se niega a indicar el número exacto, en lugar de convertirse en una pestaña que no responde y pierde lo que pegaste. La salida de

La salida CSV también está limitada a 100,000 filas y 2,000 columnas, porque una matriz profundamente anidada se aplana en una columna por elemento y unos pocos megabytes de JSON pueden convertirse en una tabla que ninguna hoja de cálculo abrirá.

Las entradas vacías y con solo espacios en blanco se informan como vacías en lugar de convertirse en un documento nulo o vacío. La sintaxis no válida se informa con una línea y una columna en los cuatro formatos legibles.

Los propios analizadores se descargan sólo cuando una conversión los necesita. Al abrir el kit de herramientas para decodificar un JWT no se obtiene ninguno de ellos.

¿Qué pasa con lo que pegas?

  • Cada conversión, hash, decodificación y diferenciación se ejecuta en la pestaña de su navegador. Ninguna entrada se carga, registra o almacena en un servidor, porque no hay ningún servidor involucrado una vez que la página se ha cargado.
  • Los hashes provienen de la implementación Web Crypto del propio navegador y los UUID de su generador aleatorio criptográficamente seguro. Ninguno de los dos implica una llamada de red.
  • Nada de lo que escribe se escribe en el almacenamiento local o en una cookie. Al recargar la página se descarta; cerrar la pestaña la descarta.
  • La analítica de todo el sitio se ejecutan únicamente en el host de producción canónico configurado y se describen en la Política de Privacidad; Los hosts locales y de vista previa lo rechazan. Los valores, tokens, URL y contenidos de archivos pegados están excluidos de los eventos analíticos propios de ToolAcre. La publicidad está deshabilitada en la configuración actual.
  • Dicho esto: una clave JWT o API es una credencial activa. El hábito seguro es nunca pegar uno en una página web que usted no escribió, por muy confiables que sean sus afirmaciones, incluida ésta.

Preguntas

¿Por qué mi documento XML falla al "declarar un DOCTYPE"?

Porque contiene una declaración de tipo de documento y este convertidor rechaza cada una de ellas en lugar de confiar en una configuración del analizador para manejar entidades de forma segura. Elimina el DOCTYPE si el contenido es tuyo. No hay opción para permitirlo.

¿Por qué mi fecha y hora TOML apareció como una cadena entre comillas?

Porque JSON, YAML y XML no tienen tipo de fecha. La fecha y hora se convirtió al texto RFC 3339 con el que fue escrita, que es una cadena en cualquier otro formato. Por lo tanto, la conversión produce una cadena y la herramienta le avisa en el momento en que sucede en lugar de permitirle saberlo más tarde.

¿Por qué una de mis celdas CSV comienza con un apóstrofe?

Porque su texto comienza con =, +, -, @, una tabulación o un retorno de carro, y una hoja de cálculo ejecuta dicha celda como fórmula cuando se abre el archivo. El apóstrofe marca la celda como texto; no es parte del valor una vez que se lee la celda. Puede desactivar el escape y la herramienta le dirá lo que eso significa.

¿Por qué un único elemento XML repetido no es una matriz?

Porque XML no proporciona ninguna forma de distinguir una lista de uno de un valor único. Ambos están escritos de manera idéntica. Hacer una suposición en cualquier dirección sería incorrecto la mitad de las veces, por lo que la herramienta informa lo que realmente hay allí.

¿Puedo volver a convertir CSV a JSON aquí?

No. Leer CSV correctamente requiere decidir sobre un delimitador, un dialecto de cita, si la primera fila es un encabezado y un tipo para cada celda. Un conversor que adivina los cuatro se equivoca silenciosamente, que es la peor manera de equivocarse. Utilice una herramienta CSV que solicite.

¿Por qué "NO" no se convierte en falso?

Porque ese comportamiento pertenece a YAML 1.1 y esta herramienta dice YAML 1.2, donde solo verdadero y falso son booleanos. El comportamiento 1.1 es la razón por la que el código de país de Noruega es una broma corriente en la gestión de configuración. Cuando la herramienta escribe YAML, cita dichas cadenas para que ningún analizador 1.1 posterior pueda leerlas mal tampoco.

Limitaciones

  • CSV está escrito, nunca leído. Aquí no hay conversión de CSV a JSON, por elección propia.
  • Los comentarios se pierden en todas direcciones, en todos los formatos que los tengan.
  • Una fecha y hora TOML se convierte en una cadena en cualquier otro formato, por lo que un viaje de ida y vuelta TOML cambia esos tipos. No existe un camino sin pérdidas.
  • Un documento XML que contiene un DOCTYPE se rechaza de plano, incluidos los inofensivos, y el rechazo no se puede desactivar.
  • Un único elemento XML repetido no se puede distinguir de uno no repetido, por lo que de XML a JSON y a XML no siempre devuelve la forma original.
  • El contenido mixto XML (texto intercalado con elementos secundarios) pierde la posición del texto en relación con los elementos secundarios y no puede circular de ida y vuelta.
  • Los valores XML son cadenas a menos que la inferencia de tipos esté activada, porque XML no declara ningún tipo; con inferencia, "0755" y "NO" están sujetos a las malas interpretaciones habituales.
  • TOML no tiene nulos: las claves nulas se eliminan de la salida TOML y los nulos dentro de las matrices se convierten en cadenas vacías.
  • La raíz de un documento TOML debe ser una tabla, por lo que una matriz JSON o un escalar no se pueden convertir a TOML en absoluto.
  • JSON son dobles IEEE-754. Los números enteros posteriores a 2^53 se convierten en cadenas en lugar de redondearse silenciosamente, lo que cambia su tipo.
  • CSV no puede distinguir una cadena vacía de una nula; ambos están escritos como una celda vacía.
  • El aplanamiento de CSV utiliza un punto tanto para las claves de objeto como para los índices de matriz, por lo que una clave que ya contiene un punto produce un nombre de columna ambiguo sobre el que se advierte pero no se escapa.
  • Los anclajes y alias YAML se resuelven en lugar de conservarse; la salida no tiene anclajes y se rechaza un alias recursivo porque ningún formato de destino puede expresar un ciclo.
  • La entrada tiene un límite por formato (8 millones de caracteres para JSON, 4 millones para XML, 2 millones para YAML y TOML) y los documentos de gran tamaño se rechazan en lugar de procesarse lentamente.
  • Nada aquí se valida con un esquema. Un documento puede convertirse limpiamente y aun así ser incorrecto para su propósito.