Todo documento JSON ya es una expresion JavaScript valida. Puedes pegar
JSON en una asignacion const config = y se ejecuta. El trabajo interesante
es lo contrario: los literales de objetos JavaScript reales estan llenos de
cosas que JSON prohibe, y un convertidor que adivina lo que significaban
pierde datos mientras reporta exito.
Usando el convertidor JSON a JavaScript
Elige una direccion y presiona Convertir. Al escribir JavaScript, una clave
de objeto que es un identificador valido se escribe sin comillas, asi
"name" se convierte en name, mientras que una clave como "display name"
se mantiene entrecomillada porque escribirla sin comillas cambiaria su
ortografia. Un objeto o array vacio se mantiene en una linea. Los numeros
viajan a traves del flujo de tokens en vez de a traves de JSON.parse,
asi que un entero de veinte digitos regresa con los veinte digitos
completos.
Que acepta el lector
Leer JavaScript de vuelta a JSON, la herramienta entiende los literales
de objetos que realmente pegarias de un archivo de configuracion: claves
sin comillas, cadenas con comillas simples, comentarios // y /* */,
comas finales, y un nombre const, let o var opcional al frente con
un punto y coma al final. Un literal de plantilla sin interpolacion tambien
se acepta, ya que contiene texto plano.
Una ortografia de numero que JSON rechaza se normaliza a su forma JSON exacta:
const numbers = { a: .5, b: 5., c: 5.e3 }
{
"a": 0.5,
"b": 5,
"c": 5e3
}
Que se rechaza, y por que
Todo lo que JSON no puede contener se rechaza por nombre en vez de
adivinarse. undefined, NaN e Infinity no tienen numero o valor JSON,
asi que se rechazan. Tambien los numeros hexadecimales, octales y binarios,
separadores de digitos con guion bajo como 1_000, y un cero inicial,
todos los cuales cambiarian de significado si JSON los leyera. Una
expresion regular, una funcion, una palabra suelta, y la interpolacion de
plantillas ${...} tambien se rechazan, porque esos son codigo, no datos.
Dos rechazos merecen un vistazo mas cercano. Una clave que aparece dos veces
en un objeto se rechaza, ya que JSON no tiene forma de contener ambos
valores bajo un solo nombre. Y una clave __proto__ cuyo valor es un
objeto o null se rechaza, porque en un literal de objeto JavaScript esa
ortografia no crea una propiedad. Establece el prototipo del nuevo objeto,
asi que convertirlo a JSON con una clave __proto__ ordinary inventaria
una propiedad que el codigo original nunca tuvo.
Por que undefined no se convierte en null por defecto
JSON no tiene undefined, asi que un convertidor tiene que hacer algo.
Escribir null cambia silenciosamente lo que los datos significaban: un
undefined en un objeto de configuracion usualmente significa que un campo
no esta configurado aun, que no es lo mismo que un null que el codigo
verifica despues. La herramienta rechaza por defecto, y la opcion de
Convertir undefined a null existe para cuando genuinamente quieres ese
significado.
Viaje redondo
Convertir un documento de vuelta al otro formato es la prueba real de si las reglas de comillas y rechazo son correctas. Un literal de objetos con claves sin comillas, comillas simples y una coma final regresa como JSON con cada clave entrecomillada y cada digito intacto, y convertir ese JSON de nuevo devuelve el mismo objeto. Una regla incorrecta usualmente solo se muestra cuando conviertes de vuelta y comparas.