Elffuss CodeProyecto del día
Proyecto del día · 15 de septiembre de 2026

El formateador de JSON que redondeaba los IDs sin avisar

Pegabas la respuesta de la API, la veías bonita e indentada… y un pedido de 19 dígitos volvía con los últimos tres cambiados. Nada petaba.

El IDE con IA local en el navegadorlocal · en el navegador

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:

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 →
nada de esto se sube a ningún sitio