JSON a MessagePack
Codifica JSON a MessagePack en tu navegador. Salida en base64 o hexadecimal, lista para meter en un frame de WebSocket, un valor de Redis o un cuerpo HTTP.
Entrada
Salida
¿Qué es JSON a MessagePack?
Tienes una configuración JSON que va a salir por un WebSocket con presupuesto justo — MessagePack la encoge entre un 30 y un 60% frente al mismo payload como JSON, y lo hace sin renunciar a esa sensación schemaless de "es solo un objeto" que hace que JSON sea agradable de usar. Esta página codifica el JSON que pegues a la izquierda en un flujo de bytes msgpack a la derecha, servido como base64 por defecto y conmutable a hexadecimal con un clic.
La codificación se ejecuta enteramente en tu navegador usando la librería oficial @msgpack/msgpack, así que el JSON nunca sale de la pestaña. Por debajo parseamos la entrada con JSON.parse (el mismo parser que describe la RFC de JSON), pasamos el objeto resultante a msgpackEncode y convertimos el Uint8Array devuelto en una cadena apta para transporte — base64 (según la RFC 4648) o hex en minúsculas.
Usa base64 cuando vayas a embeber los bytes en JSON, una cabecera HTTP o un campo de base de datos. Usa hex cuando estés comparando una muestra byte a byte contra la especificación del formato msgpack o el log de un servidor. Mismos bytes, distinta representación.
Cómo usar el codificador de JSON a MessagePack
Tres pasos. La conversión es automática a medida que escribes — no hay botón que pulsar.
Pega JSON o carga el ejemplo
Suelta tu JSON en el editor de la izquierda. Pulsa JSON de ejemplo para un payload pequeño de pedido que ejercita los casos que importan — strings, enteros, floats y un array anidado. El codificador trata la entrada según el sistema de tipos estándar de MessagePack: los enteros toman la forma fixint/int8/int16/int32/int64 más pequeña que quepa, los floats se convierten en float64, los strings se codifican como fixstr/str8/16/32 según su longitud, los arrays usan fixarray/array16/32 y los maps usan fixmap/map16/32. Ejemplo de entrada:
{
"orderId": "ORD-7421",
"items": [{ "sku": "SKU-101", "qty": 2 }],
"total": 89.50
}Un JSON de 90 bytes como este suele codificarse en ~55 bytes de msgpack — un tercio menos, antes de cualquier capa de gzip por encima.
Cambia entre hex o base64
El formato de salida por defecto es base64 porque suele ser lo que pegas en una configuración o envías por la red. Pulsa Salida hexadecimal para alternar a hex en minúsculas si estás haciendo un diff contra un codificador del lado servidor o mirando los bytes de tipo a ojo (p. ej. 0x82 para un fixmap de 2). Alterna las veces que quieras — los bytes de fondo son los mismos.
Copia y envía
Pulsa Copiar para llevar la salida al portapapeles. Mete los bytes directamente en un SET de Redis, en un frame de texto WebSocket, en un cuerpo HTTP con Content-Type: application/x-msgpack o en una columna bytea de Postgres (decodifica el base64 antes). Para el camino inverso, pega los bytes en nuestra página MessagePack a JSON.
Cuándo lo vas a usar de verdad
Reducir frames de WebSocket
Las apps en tiempo real con actualizaciones por segundo notan la diferencia de tamaño. Una actualización de posición o un tick del libro de órdenes que ocupa 220 bytes como JSON baja a ~140 bytes como msgpack — multiplicado por miles de frames por segundo, eso suma. Convierte aquí un mensaje de muestra, pega los bytes en tu banco de pruebas y verifica que el receptor los decodifica igual.
Compactar valores en caché
Cachés como Redis te cobran por cada byte almacenado y por cada byte leído. Codificar los objetos cacheados como msgpack en vez de texto JSON-stringified ahorra almacenamiento y red en cada hit. Usa esta página para hacer un sanity check de cómo queda un objeto concreto en bytes antes de comprometer la codificación en tu serializador.
Enviar números tipados
JSON tiene un único tipo numérico y trata 42 igual que 42.0. MessagePack distingue entre entero y float en el cable — útil cuando el receptor es un lenguaje fuertemente tipado como Go, Rust o C# y no quieres ir y volver a través de un string. Pega un número JSON e inspecciona el byte de tipo en la salida hex para confirmar que se codificó como int y no como float.
Depurar un decodificador
¿Tienes un servicio que "debería" devolver msgpack pero el consumidor se atraganta con los bytes? Codifica aquí el mismo JSON, compara la salida de tu servicio con la nuestra byte a byte en modo hex, y la divergencia te dice exactamente qué campo o tipo está mal. El codificador de referencia sigue la especificación publicada al pie de la letra.
Preguntas frecuentes
¿El JSON sale en algún momento de mi navegador?
No. El JSON se parsea con el JSON.parse nativo del navegador, lo codifica la librería @msgpack/msgpack en JavaScript del lado cliente y se renderiza como base64 o hex en el panel derecho — no hay llamada al servidor, no hay telemetría sobre la entrada y no se registra nada. Puedes abrir DevTools y comprobar que la pestaña de red queda en silencio mientras escribes. Seguro para configuraciones propietarias y datos de clientes.
¿Por qué la salida es más grande de lo que esperaba?
Suelen ser dos motivos. Primero, base64 infla el conteo de bytes en torno a un 33% — si comparas msgpack-en-base64 con texto JSON directamente no estás comparando el tamaño real en el cable. Cambia a hex (que infla x2) o, mejor, mira la longitud en bytes: en DevTools, atob(output).length te da el tamaño de verdad. Segundo, msgpack solo gana a JSON cuando los datos llevan muchos números, booleanos o strings cortos repetidos. Un blob compuesto en un 90% por strings largos y únicos quedará más o menos igual en cualquiera de los dos formatos.
¿Cómo se manejan enteros, floats y números grandes?
El JSON.parse de JavaScript convierte cada número en un float de 64 bits, así que cuando los datos llegan al codificador ya hemos perdido la distinción int-vs-float. La librería es razonable con esto: un valor que sea entero y esté dentro del rango de int seguro se codifica como int (usando la variante más pequeña que quepa — fixint, int8, int16, int32 o int64). Cualquier otra cosa se codifica como float64. Si necesitas enteros exactos de 64 bits (como IDs de Snowflake), pásalos por el JSON como strings y conviértelos en el receptor.
¿Puedo codificar blobs binarios (como bytes de un fichero) con esto?
Directamente a través de JSON, no — JSON no tiene tipo bin, así que un Uint8Array da una vuelta por esta UI como string base64 y se vuelve a codificar como un str de msgpack, no como un bin. Si necesitas tipos bin o ext reales de msgpack (las dos grandes funciones que solo existen en msgpack), tienes que construir el objeto en código y llamar a encode directamente con un Uint8Array en su sitio. El panel JSON cubre el 90% de los casos en los que tus datos ya tienen forma de JSON.
¿Qué diferencia hay entre la salida en hex y en base64?
Son dos formas de escribir los mismos bytes como texto. Hex son dos caracteres por byte (así que 0x82 se convierte en el string "82") — útil para leer a ojo los bytes de tipo de la spec. Base64 son cuatro caracteres por cada tres bytes según la RFC 4648 — más denso, y la forma estándar de embeber binario en JSON, JWTs o cabeceras HTTP. Elige la que mejor encaje donde vas a pegar la salida.
¿Es msgpack realmente más rápido que JSON o solo más pequeño?
Más pequeño suele ser la victoria mayor. En velocidad de codificar/decodificar, el JSON.parse moderno está tan optimizado que msgpack empata o solo gana un 10-20% en JS. La ganancia de la serialización aparece aguas abajo: payloads más pequeños suponen menos tiempo de red y menos trabajo para el receptor si está en un lenguaje donde parsear JSON cuesta más que parsear msgpack (mirándote a ti, Python). Regla rápida: elige msgpack si el cuello de botella es el ancho de banda o el almacenamiento; quédate con JSON si lo es la legibilidad y el tooling.
Otras herramientas de MessagePack
Codificar es una dirección. Estas cubren el resto del viaje de ida y vuelta: