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.

1

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.

2

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.

3

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: