piapia123
es

Conversor TOML ↔ JSON

Formato

Todo se ejecuta en tu navegador: no se sube nada

Entrada
Arrastra un archivo aquí para cargarlo
Resultado

Convierte un archivo TOML (Cargo.toml, pyproject.toml, cualquier configuración `*.toml`) a JSON, o al revés. Usa una implementación completa de TOML 1.0, así que los cuatro tipos de fecha y hora, las cadenas de varias líneas, las claves con puntos, los arrays de tablas (`[[x]]`) y los números hexadecimales o con guiones bajos se manejan bien: un subconjunto casero de «key = value y unas secciones» acabará leyendo alguna entrada como otra cosa sin avisar. Se tratan los tres puntos que alteran tus datos en silencio: · Las fechas y horas locales no se convierten de zona horaria. El `1979-05-27` de TOML es *ese día*, no «ese día a las 00:00 UTC»; `07:32:00` tampoco tiene zona. Tratarlos como instantes desplaza la fecha un día entero al este de UTC. · Los enteros grandes conservan todos los dígitos. Lo que pasa de 2^53 sale como cadena (`9223372036854775807` se vuelve `...5808` como Number): cambia el tipo, ni un carácter del valor. · `inf` / `-inf` / `nan` no se vuelven null. JSON no tiene esos valores y `JSON.stringify(Infinity)` devuelve `null`, sin error: `inf = inf` se convierte en `{"inf": null}` sin decir nada. Aquí pasan a cadenas, así que el valor se sigue viendo. En la otra dirección hay un problema inevitable: TOML no tiene tipo null, y el comportamiento predeterminado es descartar la clave entera. Así que aquí se da un error por defecto que nombra la clave, y las opciones permiten escribir una cadena vacía u omitirla.

Funciones

  • Las dos direcciones, detectadas automáticamente o fijadas a mano
  • Los cuatro tipos de fecha y hora siguen la norma: las fechas y horas locales no llevan conversión de zona horaria (que desplazaría la fecha un día)
  • Los arrays de tablas `[[x]]` y los arrays de objetos se convierten en ambos sentidos; las claves con puntos se expanden a objetos anidados y las que necesitan comillas las reciben
  • Los enteros grandes van por BigInt: lo que pasa de 2^53 sale como cadena, dígito a dígito
  • inf / -inf / nan pasan a cadenas en vez de volverse null en silencio, como hace JSON.stringify
  • En JSON → TOML, un null da error con su ruta (TOML no tiene tipo null y el comportamiento predeterminado descarta la clave)
  • Los null pueden en cambio volverse una cadena vacía u omitirse; un null dentro de un array no se puede omitir (desplazaría todos los índices siguientes)
  • Los errores de análisis señalan una línea y una columna en vez de decir «formato incorrecto»
  • Si el nivel superior no es un objeto, se explica que «un documento TOML siempre es una tabla» en vez de soltar un error de la librería
  • Salida con resaltado; el sangrado del JSON admite 2 o 4 espacios, o tabulador

Cómo se usa

  1. Pega TOML o JSON: lo que se pueda analizar como JSON se trata como JSON y el resto como TOML
  2. El resultado se actualiza mientras escribes; la dirección también se puede fijar a mano
  3. Si JSON → TOML avisa de un null, elige cómo tratarlo y continúa
  4. Copia el resultado

Preguntas frecuentes

¿Por qué da error con un null de mi JSON?
Porque TOML no tiene ningún tipo null. Convertirlo tiene tres desenlaces y ninguno es sin pérdida: la clave desaparece entera (el comportamiento predeterminado de la librería y el más peligroso: recibes una configuración a la que le falta un campo en silencio), el valor pasa a cadena vacía (la clave sobrevive, el tipo cambia de null a cadena), o la clave se omite. Aquí se da error por defecto y se nombra la clave, porque las otras dos te dejan una configuración que parece correcta y no lo es, sin nada que te avise. Cuando sepas qué clave es, elige una opción para continuar.
¿Por qué los enteros grandes se volvieron cadenas? ¿Y inf / nan?
Porque JSON no puede expresarlos. Los enteros por encima de 2^53 no tienen representación exacta en JavaScript: `9223372036854775807` se convierte en `...5808` y los dígitos finales se pierden en silencio. Y `inf` / `-inf` / `nan` no tienen representación alguna: `JSON.stringify(Infinity)` produce null, sin error. Antes que emitir un valor que parece correcto y no lo es, pasan a cadenas: cambia el tipo, no el valor, y ves el cambio en la salida.
¿Por qué las fechas locales no llevan zona horaria?
Porque en TOML no la tienen. `birthday = 1979-05-27` significa *ese día*, y `alarm = 07:32:00` significa *esa hora del día*; ninguno apunta a un instante. Si la conversión lo tratara como «1979-05-27 00:00 UTC» y luego lo mostrara en tu zona, quien esté al este de UTC vería el 26 de mayo: la fecha desplazada un día. Por eso la salida conserva `1979-05-27` exactamente, sin `Z`. Las dos formas con desfase (`1979-05-27T07:32:00Z` y `...-07:00`) conservan su desfase.
¿Dónde se fueron los comentarios?
JSON no tiene ninguna estructura que pueda llevar un comentario: solo objetos, arrays y escalares. Convertir a JSON solo puede descartarlos, y la dirección inversa no tiene ninguno que conservar de entrada. Si los comentarios importan, guarda el TOML original en lugar de tratarlo como un paso intermedio.

Herramientas relacionadas