El caso de hoy empieza con una tontería. Dani quería un formateador de JSON dentro del propio proyecto: pegas la respuesta cruda de la API, la ves indentada y te ahorras el viaje al beautifier de turno. Media hora de trabajo, como mucho.
La primera versión la escribe cualquiera: JSON.parse, JSON.stringify con indentación de dos espacios, y listo. Funcionó una semana entera. Hasta que Dani formateó una respuesta de pedidos y se puso a buscar el ID 1385729047382910473 en el panel de soporte. No aparecía por ningún lado.
Sí existía el pedido. Lo que no existía era el número que tenía delante: el formateador le había devuelto 1385729047382910500.
El fallo no estaba en el código, estaba en el tipo
Un número de JSON se convierte en un double. Por encima de 2^53, los últimos dígitos son decoración: el valor se redondea al double más cercano y nadie lanza una excepción. Los IDs tipo snowflake, los BIGINT de Postgres, los importes en céntimos de una cartera grande… todos caen ahí. Al hacer parse y stringify, el formateador no estaba embelleciendo el JSON: lo estaba reinterpretando y volviéndolo a escribir.
Un formateador no debería tener opinión sobre tus datos. El nuestro la tenía, y encima en silencio.
Dónde ayuda tener la IA en la misma pestaña que el JSON
Aquí está lo interesante. Si preguntas en abstracto “hazme un formateador de JSON”, cualquier modelo te da parse y stringify, y hace bien: es la respuesta correcta a la pregunta que has hecho. La conversación cambia cuando pegas el payload de verdad, con el ID que se rompe.
Con eso delante, el planteamiento fue otro: no parsees nada. Recorre el texto como un flujo de tokens —cadenas con sus escapes, números, llaves, corchetes, comas, dos puntos— y toca únicamente el espacio en blanco que hay entre ellos. El número se copia tal cual, dígito a dígito, como subcadena. Nunca llega a ser un number de JavaScript, así que no hay nada que redondear.
De paso salieron los casos incómodos, que son los que convierten media hora en una tarde:
- llaves y corchetes dentro de una cadena, que no abren ni cierran nada;
- comillas escapadas justo antes del cierre;
- exponentes absurdos que ni caben en un double;
- objetos y arrays vacíos, que quedan feísimos si los indentas;
- y JSON mal formado: ¿avisas, o devuelves el texto intacto?
Por eso el payload no salió de la máquina
Ese JSON llevaba emails de clientes, un teléfono, la dirección de entrega y una cabecera de autorización que Dani ni se había molestado en quitar, porque era una pestaña de su navegador. Es exactamente el pegado que acaba en un formateador online un jueves a última hora. Y a partir de ahí el JSON ya no es tuyo: ha viajado, lo ha recibido un servidor de alguien y no sabes qué hace con él.
Con el modelo corriendo dentro de la propia pestaña, sobre tu GPU, el código y el prompt se quedan donde ya estaban. No hay que elegir entre dar el ejemplo bueno o anonimizarlo y recibir la respuesta genérica de siempre. Y ese es el fondo del asunto: el ejemplo de verdad es el que encuentra el bug.
Abre Elffuss Code y pega tu payload tal cual: el IDE y el modelo corren en tu navegador, así que ni el JSON ni el prompt suben a ningún sitio.
Abrir Code →