JSON para MessagePack
Codifica JSON em MessagePack no teu navegador. Saída em base64 ou hex, pronta para ir num frame WebSocket, num valor do Redis ou num corpo HTTP.
Entrada
Saída
O que é JSON para MessagePack?
Tens uma config JSON que vai sair por um WebSocket com orçamento apertado — o MessagePack reduz isso em 30 a 60% face ao mesmo payload em JSON, e fá-lo sem perder a sensação schemaless e "é só um objeto" que torna o JSON agradável de usar. Esta página codifica o JSON que colares à esquerda num stream de bytes msgpack à direita, servido como base64 por defeito e comutável para hex com um clique.
A codificação corre inteiramente no teu navegador, usando a biblioteca oficial @msgpack/msgpack, por isso o JSON nunca sai do separador. Por baixo, fazemos parse da entrada com JSON.parse (o mesmo parser descrito pela RFC do JSON), passamos o objeto resultante a msgpackEncode e transformamos o Uint8Array devolvido numa string apta para transporte — base64 (segundo a RFC 4648) ou hex em minúsculas.
Usa base64 quando estás a embeber os bytes em JSON, num cabeçalho HTTP ou num campo de base de dados. Usa hex quando estás a comparar uma amostra byte a byte contra a spec do formato msgpack ou um log de servidor. Mesmos bytes, representação diferente.
Como usar o codificador JSON para MessagePack
Três passos. A conversão acontece automaticamente enquanto escreves — sem botão para clicar.
Cola JSON ou carrega o exemplo
Larga o teu JSON no editor da esquerda. Carrega em JSON de exemplo para um pequeno payload de encomenda que cobre os casos que importam — strings, inteiros, floats e um array aninhado. O codificador trata a entrada como o sistema de tipos padrão do MessagePack: inteiros vão para a forma mais pequena fixint/int8/int16/int32/int64, floats viram float64, strings vão para fixstr/str8/16/32 conforme o comprimento, arrays usam fixarray/array16/32 e maps usam fixmap/map16/32. Exemplo de entrada:
{
"orderId": "ORD-7421",
"items": [{ "sku": "SKU-101", "qty": 2 }],
"total": 89.50
}Um JSON de 90 bytes como este costuma ficar em ~55 bytes de msgpack — um terço mais pequeno, antes de qualquer camada de gzip por cima.
Alterna entre hex e base64
O formato de saída por defeito é base64, porque é o que normalmente colas numa config ou envias pela rede. Carrega em Saída em hex para passar a hex em minúsculas se estás a fazer diff contra um codificador do lado servidor ou a olhar para os bytes de tipo a olho (ex.: 0x82 para um fixmap de 2). Alterna as vezes que quiseres — os bytes por baixo são os mesmos.
Copia e envia
Carrega em Copiar para colocar a saída na área de transferência. Mete os bytes diretamente num SET do Redis, num frame de texto WebSocket, num corpo HTTP com Content-Type: application/x-msgpack ou numa coluna bytea do Postgres (descodifica o base64 primeiro). Para o sentido inverso, cola na nossa página MessagePack para JSON.
Quando vais mesmo usar isto
Encolher frames de WebSocket
Apps em tempo real com atualizações por segundo notam a diferença de tamanho. Uma atualização de posição ou um tick de order book com 220 bytes em JSON cai para ~140 bytes em msgpack — entre milhares de frames por segundo, isto soma. Converte aqui uma mensagem de exemplo, cola os bytes no teu test harness e confirma que o recetor descodifica da mesma forma.
Compactar valores em cache
Caches como o Redis cobram-te por cada byte armazenado e por cada byte lido. Codificar os objetos em cache como msgpack em vez de texto JSON-stringified poupa armazenamento e rede em cada hit. Usa esta página para ver como um determinado objeto fica em bytes antes de fixar a codificação no teu serializador.
Enviar números tipados
O JSON tem um único tipo numérico e trata 42 da mesma forma que 42.0. O MessagePack distingue inteiro e float no fio — útil quando o recetor é uma linguagem fortemente tipada como Go, Rust ou C# e não queres dar uma volta por uma string. Cola um número JSON e inspeciona o byte de tipo na saída hex para confirmar que foi codificado como int e não como float.
Depurar um descodificador
Tens um serviço que "devia" devolver msgpack mas o consumidor engasga-se nos bytes? Codifica o mesmo JSON aqui, compara a saída do teu serviço com a nossa byte a byte em modo hex, e a divergência diz-te exatamente que campo ou tipo está mal. O codificador de referência segue à letra a especificação publicada.
Perguntas frequentes
O JSON sai do meu navegador em algum momento?
Não. O JSON é parsed pelo JSON.parse nativo do navegador, codificado pela biblioteca @msgpack/msgpack em JavaScript do lado cliente, e renderizado como base64 ou hex no painel direito — não há chamada ao servidor, não há telemetria sobre a entrada e nada é registado. Podes abrir o DevTools e confirmar que o separador de rede fica em silêncio enquanto escreves. Seguro para configs proprietárias e dados de clientes.
Porque é que a saída é maior do que esperava?
Geralmente, dois motivos. Primeiro, o base64 inflaciona a contagem de bytes em cerca de 33% — se comparares msgpack-em-base64 com texto JSON diretamente, não estás a comparar o tamanho real no fio. Muda para hex (que inflaciona x2) ou, melhor, olha para o comprimento em bytes: no DevTools, atob(output).length dá-te o tamanho real. Segundo, o msgpack só vence o JSON quando os dados têm muitos números, booleanos ou strings curtas repetidas. Um blob com 90% de strings longas e únicas vai ter aproximadamente o mesmo tamanho em qualquer formato.
Como são tratados inteiros, floats e números grandes?
O JSON.parse do JavaScript transforma cada número num float de 64 bits, por isso quando os dados chegam ao codificador já perdemos a distinção int-vs-float. A biblioteca lida com isto de forma sensata: um valor que seja inteiro e dentro do intervalo de safe-int é codificado como int (na variante mais pequena que couber — fixint, int8, int16, int32 ou int64). Tudo o resto é codificado como float64. Se precisas de inteiros 64 bits exatos (como Snowflake IDs), passa-os pelo JSON como strings e converte no recetor.
Posso codificar blobs binários (como bytes de ficheiros) com isto?
Diretamente via JSON, não — o JSON não tem tipo bin, por isso um Uint8Array dá uma volta por esta UI como string base64 e é re-codificado como um str de msgpack, e não como bin. Se precisas mesmo de tipos bin ou ext de msgpack (as duas grandes funcionalidades exclusivas do msgpack), tens de construir o objeto em código e chamar encode diretamente com um Uint8Array no lugar. O painel JSON serve para os 90% dos casos em que os dados já têm forma de JSON.
Qual é a diferença entre saída em hex e em base64?
São duas formas de escrever os mesmos bytes como texto. Hex são dois caracteres por byte (logo 0x82 torna-se a string "82") — útil para ler à vista os bytes de tipo da spec. Base64 são quatro caracteres por cada três bytes, segundo a RFC 4648 — mais denso, e a forma padrão de embeber binário em JSON, JWTs ou cabeçalhos HTTP. Escolhe consoante o sítio onde vais colar a saída.
O msgpack é mesmo mais rápido do que o JSON ou apenas mais pequeno?
Mais pequeno costuma ser o ganho maior. Em velocidade de codificar/descodificar, o JSON.parse moderno está tão otimizado que o msgpack empata ou vence só por 10-20% em JS. O ganho da serialização aparece a jusante: payloads mais pequenos significam menos tempo de rede e menos trabalho para o recetor se estiver numa linguagem onde fazer parse de JSON custa mais do que de msgpack (a olhar para ti, Python). Regra rápida: escolhe msgpack se o gargalo for largura de banda ou armazenamento; fica com JSON se for legibilidade e tooling.
Outras ferramentas MessagePack
Codificar é só um sentido. Estas cobrem o resto da ida e volta: