Ir al contenido principal
CuteJSON
↑↓ Navegar Enter Seleccionar Esc Cerrar

Como convertir JSON a literales de objetos JavaScript y viceversa

Publicado 3 min de lectura Por Akash Kinkar Pandey

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.

Volver a todas las entradas