Pular para o conteúdo
Aback Tools Logo

MessagePack vs JSON: Tamanho, Velocidade e Overhead comparados

MessagePack vs JSON comparados: de onde vem a redução de tamanho de 20-50%, velocidade de serialização por runtime, diferenças de sistema de tipos e quando o trade-off vale a pena.

DH
12 min de leitura2,750 palavras

JSON é a língua franca das APIs web - legível, universal e compatível com tudo. MessagePack é um formato de serialização binário criado para transportar os mesmos dados com 20-50% menos bytes, com parsing mais rápido nas duas pontas. Entender exatamente de onde vem essa redução de tamanho, o que você abre mão e quando o trade-off vale a pena é a diferença entre uma otimização prematura e uma melhoria mensurável de infraestrutura.

20-50%Menor que JSON minificadoEconomia típica de payload
2-4×Serialização mais rápidavs parsing de JSON em texto
< 1sTempo de comparaçãoPara qualquer payload JSON

O que é MessagePack?

MessagePack é um formato de serialização binário criado por Sadayuki Furuhashi em 2008 e publicado como especificação aberta. Ele codifica os mesmos tipos de dados que o JSON - null, boolean, integer, float, string, array, map - mas usa representações binárias compactas em vez de texto legível por humanos. Um `true` booleano que ocupa 4 bytes como texto JSON ocupa exatamente 1 byte em MessagePack. Um inteiro pequeno como 42 ocupa 3 bytes em JSON e 1 byte em MessagePack.

O formato é sem schema: assim como o JSON, não exige um schema predefinido para codificar ou decodificar dados. Isso o torna um substituto direto do JSON na maioria dos contextos de API - você troca o serializador sem mudar o modelo de dados. MessagePack tem amplo suporte, com bibliotecas oficiais e da comunidade em Python, JavaScript, Go, Ruby, Java, C++, Rust e mais de 50 outras linguagens.

Como funciona a codificação MessagePack

  • Byte de tag de tipo - cada valor começa com uma tag de 1 byte que codifica o tipo e, para valores pequenos, o próprio valor (fixint, fixstr, fixarray, fixmap).
  • Inteiros - inteiros pequenos (0-127) ocupam 1 byte no total. Inteiros maiores usam 2, 4 ou 8 bytes conforme a magnitude, sempre menores que sua representação decimal em texto.
  • Strings - codificadas como uma sequência de bytes UTF-8 prefixada pelo comprimento. Strings curtas (≤31 caracteres) usam cabeçalho de 1 byte; strings longas usam cabeçalho de 2 ou 4 bytes.
  • Booleanos e null - cada um ocupa exatamente 1 byte. Em JSON, `true` tem 4 bytes, `false` tem 5 bytes e `null` tem 4 bytes.
  • Arrays e maps - prefixados pelo comprimento; arrays pequenos (≤15 elementos) usam 1 byte de overhead, contra os colchetes `[` `]` e as vírgulas do JSON.

Note

MessagePack não é um algoritmo de compressão - ele não aplica LZ77, codificação Huffman nem qualquer forma de compressão por entropia. A redução de tamanho vem inteiramente do uso de codificações binárias compactas de tipos em vez de caracteres de texto. Aplicar compressão gzip ou Brotli sobre o MessagePack reduz ainda mais, mas o JSON comprimido como texto costuma fechar boa parte da diferença, porque os nomes de chaves repetitivos do JSON se comprimem extremamente bem.

Comparação de tamanho: quanto menor é o MessagePack?

A redução de tamanho ao migrar para MessagePack depende inteiramente da composição dos dados do seu payload. Payloads com muitos campos numéricos, booleanos e valores null obtêm os maiores ganhos. Payloads com muitas strings - textos longos, UUIDs, datas ISO - ganham menos, porque o conteúdo da string é armazenado como bytes UTF-8 crus nos dois formatos.

A economia vem das informações de tipo e do overhead estrutural, não da compressão dos próprios valores. Uma string de 200 caracteres custa praticamente o mesmo nos dois formatos.

- Justificativa da especificação MessagePack

Comparação de tamanho por tipo de dado

ValorBytes JSON (minificado)Bytes MessagePackEconomia
true4175%
false5180%
null4175%
42 (inteiro)2150%
1000 (inteiro)4250%
"hello"7614%
"2026-06-11"12118%

Benchmarks de payloads do mundo real

Uma resposta típica de API REST com tipos de dados mistos - IDs, nomes, timestamps, flags de status e contadores - apresenta redução de 20-35%. Um payload de dados puramente numéricos (leituras de sensores, eventos de analytics) pode chegar a 40-50% de redução. Um payload com muitas strings longas (corpos de artigos, mensagens de log) pode ter apenas 5-15% de redução. A ferramenta Comparação de Tamanho JSON vs MessagePack do Aback Tools mede a economia exata em bytes para qualquer payload JSON específico - cole seu payload de produção e leia a porcentagem real em menos de um segundo.

Tip

Antes de decidir adotar MessagePack, meça a economia de tamanho nos seus payloads reais de produção, não em benchmarks sintéticos. Payloads com nomes de chaves longos e repetidos - comuns em APIs verbosas - se comprimem extremamente bem com gzip. Às vezes, o JSON comprimido com gzip é menor que o MessagePack sem compressão. Compare sempre gzip+JSON contra gzip+MessagePack para uma avaliação justa.

Comparação de Tamanho JSON vs MessagePack

Cole qualquer payload JSON e veja seu tamanho em bytes no MessagePack, a porcentagem exata de economia, o detalhamento por tipo e uma prévia em hexadecimal - local no navegador, sem upload.

Open tool

Velocidade de serialização: quanto mais rápido é o MessagePack?

A serialização e desserialização com MessagePack é tipicamente 2-4x mais rápida que o processamento de JSON em texto padrão nos benchmarks. A vantagem de velocidade vem de pular a tokenização UTF-8: parsers JSON precisam escanear cada byte procurando caracteres estruturais (chaves, aspas, vírgulas, dois-pontos), enquanto parsers MessagePack leem uma tag de tipo e saltam direto para o limite do próximo valor. Sem varredura de aspas, sem tratamento de escape, sem conversão de string numérica para inteiro.

Contexto de performance por linguagem

A diferença de velocidade varia bastante conforme o runtime. Em Python, o `msgpack` é 3-5x mais rápido que o módulo padrão `json` em payloads típicos. Porém, o `orjson` (biblioteca JSON para Python com núcleo em Rust) é quase tão rápido quanto o `msgpack` em muitas cargas - a diferença cai para 1,2-1,5x. Em Node.js, o `@msgpack/msgpack` supera o `JSON.parse` nativo em cerca de 2x. Em Go, a diferença é ainda menor, porque o `encoding/json` padrão do Go já é bem rápido.

Onde a velocidade importa mais

O ganho de velocidade de serialização faz mais sentido na comunicação interna entre microsserviços de alto throughput, onde os serviços trocam milhares de mensagens por segundo e a serialização é um custo de CPU mensurável. Para uma API web padrão que atende algumas centenas de requisições por segundo, a diferença de tempo de serialização entre JSON e MessagePack é desprezível comparada ao tempo de consulta ao banco de dados ou à latência de rede. Faça profiling do seu gargalo real antes de otimizar a serialização.

Note

Em muitos sistemas de produção, o custo dominante não é o tempo de serialização, mas o tempo de transmissão do payload. Migrar de JSON sem compressão para MessagePack reduz o tempo de transmissão proporcionalmente à redução de tamanho. Ativar HTTP/2 e compressão gzip na sua API JSON existente costuma entregar ganhos de throughput semelhantes ou maiores sem nenhuma mudança de código.

Diferenças de sistema de tipos entre MessagePack e JSON

MessagePack e JSON compartilham o mesmo conjunto de tipos essenciais - null, boolean, number, string, array e object/map - mas o MessagePack é mais rico nos níveis numérico e binário. Essas diferenças importam quando você migra uma API JSON existente ou projeta um novo protocolo, porque alguns tipos MessagePack não têm equivalente direto em JSON.

Tipos que o MessagePack adiciona além do JSON

  • Inteiro de 64 bits sem sinal - o JSON não tem tipo inteiro (números são doubles IEEE 754, que perdem precisão acima de 2^53). O MessagePack codifica valores uint64 com precisão.
  • Array de bytes binário - o MessagePack tem um tipo bin nativo para sequências de bytes crus. O JSON não tem equivalente - dados binários precisam ser codificados em base64 como string, adicionando ~33% de overhead.
  • Tipos de extensão - mecanismo reservado para tipos específicos da aplicação, como timestamps (ext type 1), decimais e dados marcados personalizados. Permite enriquecimento semântico sem schema.
  • Float32 - o MessagePack pode codificar floats de 32 bits (4 bytes). O JSON sempre usa representação textual em precisão dupla de 64 bits, que é maior e perde a informação de tipo f32.

O problema de ida e volta de tipos

Uma pegadinha crítica ao migrar de JSON para MessagePack: o JSON tem apenas um tipo numérico (double IEEE 754), enquanto o MessagePack distingue int8, int16, int32, int64, uint8-uint64, float32 e float64. Se sua aplicação serializa um número JSON e o desserializa como MessagePack, o tipo pode mudar. Um valor como 42 serializado em JavaScript (como double) pode ser desserializado em uma linguagem fortemente tipada como uint8. Sempre verifique o comportamento de ida e volta entre sua biblioteca de serialização e o serviço consumidor.

RecursoJSONMessagePack
Legível por humanos✓ Sim✗ Somente binário
Tipos inteiros✗ Nenhum (double)✓ int8-int64, uint8-uint64
Dados binários✗ Base64 necessário✓ Tipo bin nativo
Inteiros de 64 bits✗ Perda de precisão✓ uint64/int64 completo
Schema obrigatório✗ Sem schema✗ Sem schema
Nativo no navegador✓ JSON.parse/stringify✗ Biblioteca necessária
Suporte a streaming✓ Sim✓ Sim (com bibliotecas)
Tipos de extensão✗ Não✓ Sim (tipo ext)

Timestamps do MessagePack

O tipo de extensão 1 do MessagePack é um formato de timestamp padronizado que codifica o tempo Unix como valor binário de 4, 8 ou 12 bytes com precisão de nanossegundos. É menor e mais preciso que uma string ISO 8601 como `"2026-06-11T14:30:00Z"` (20 bytes como JSON) e evita ambiguidade de fuso horário. A maioria das bibliotecas MessagePack codifica e decodifica esse tipo de extensão automaticamente, tornando o tratamento de timestamps transparente para a camada de aplicação.

Quando usar MessagePack vs JSON

A escolha entre MessagePack e JSON não é sobre qual formato é "melhor" - é sobre quais restrições importam em um determinado contexto. O JSON vence em universalidade, ferramental e depuração. O MessagePack vence em tamanho de payload e velocidade de parsing. A maioria das APIs deve começar com JSON e migrar para MessagePack somente depois que o profiling confirmar que a serialização ou o tamanho do payload é um gargalo real.

Use MessagePack quando

  • Comunicação interna entre microsserviços - serviços que você controla nas duas pontas, onde legibilidade humana não é necessária e o throughput é uma preocupação mensurável.
  • Brokers de mensagens de alta frequência - tópicos Kafka, NATS e RabbitMQ transportando milhares de eventos por segundo, onde o tamanho do payload impacta diretamente o throughput e os custos de armazenamento.
  • APIs móveis com banda limitada - reduzir o tamanho do payload em 30% em uma API móvel de alto tráfego reduz de forma relevante o consumo de dados e a latência em conexões celulares.
  • Protocolos de jogos em tempo real ou IoT - onde frames binários, latência abaixo de um milissegundo e eficiência de banda são requisitos de projeto desde o início.
  • Transporte de dados binários - payloads com bytes crus (imagens, trechos de áudio, material criptográfico) evitam os 33% de overhead do base64 na codificação JSON.

Fique com JSON quando

  • APIs públicas - consumidores externos esperam JSON; adicionar MessagePack exige adoção de bibliotecas no lado do cliente e middleware de negociação de conteúdo.
  • Ferramental para desenvolvedores - DevTools do navegador, curl, Postman e exploradores de API funcionam nativamente com JSON; depurar MessagePack exige etapas extras de decodificação.
  • Endpoints de baixo tráfego - o custo de engenharia de adicionar suporte a MessagePack supera em muito o benefício quando o volume de payload é pequeno.
  • Compressão gzip já em uso - o gzip HTTP ou Brotli comprime agressivamente os nomes de chaves repetitivos do JSON, muitas vezes alcançando redução semelhante ao MessagePack puro.

Warning

A negociação de conteúdo é o caminho de migração recomendado para APIs JSON existentes: o servidor aceita tanto Accept: application/json quanto Accept: application/msgpack e responde no formato solicitado pelo cliente. Isso permite adoção gradual sem quebrar clientes existentes. Não mude uma API pública existente exclusivamente para MessagePack - o custo de depuração e ferramental para consumidores externos raramente vale a economia de tamanho.

Integração e ferramentas

MessagePack tem suporte maduro de bibliotecas em todas as principais linguagens, mas não é suportado nativamente em navegadores nem em frameworks HTTP padrão como o JSON é. Adicionar MessagePack a uma stack existente significa adicionar uma dependência, atualizar o tratamento de content-type e atualizar qualquer ferramental de depuração ou log que consuma corpos de requisição/resposta crus.

Suporte de bibliotecas por linguagem

  • Python - `msgpack` (PyPI). Extensão C rápida com fallback em Python puro. Substituto direto do `json` na maioria dos casos.
  • JavaScript / Node.js - `@msgpack/msgpack` (npm). Nativo em TypeScript, com suporte a streaming. Também `msgpackr` para maior performance.
  • Go - `github.com/vmihailenco/msgpack` ou `github.com/ugorji/go/codec`. Ambos implementam a especificação completa com suporte a tipos de extensão.
  • Java / JVM - `msgpack-java` (oficial). Integra-se ao Jackson via `jackson-dataformat-msgpack` como substituto direto do JSON.
  • Rust - `rmp` e `rmp-serde`. A serialização baseada em Serde faz de adicionar MessagePack ao lado do JSON existente uma mudança de uma linha.

Validando seu payload antes de codificar

Antes de migrar uma API de produção para MessagePack, valide a estrutura JSON que você está codificando. Um payload JSON com erros estruturais - vírgulas finais, chaves sem aspas, nulls inesperados - produzirá silenciosamente uma saída MessagePack malformada que causa erros de decodificação crípticos no lado do consumidor. Passe seu payload pelo JSON Formatter Viewer para verificar a estrutura e pelo Validador de JSON Schema para confirmar que ele está em conformidade com o formato esperado antes de codificar.

Compressores JSON

Explore as opções de redução de payloads JSON - comparação com MessagePack, encurtamento de chaves e minificação - tudo local no navegador, sem upload.

Open tool

Trade-offs e ressalvas

MessagePack não é um upgrade gratuito em relação ao JSON. O formato binário introduz custos reais em depuração, compatibilidade de ferramental e onboarding de desenvolvedores. Não são preocupações hipotéticas - são o principal motivo pelo qual a maioria das equipes que avaliam MessagePack acaba mantendo JSON para tudo, exceto os canais internos específicos de alto volume em que o trade-off claramente compensa.

A depuração é o maior custo prático

Com JSON, você pode ler um corpo de requisição cru no terminal, no DevTools do navegador ou em qualquer log de texto. Com MessagePack, você vê saída binária como `\x81\xa4name\xa5Alice`. Toda sessão de depuração exige uma etapa de decodificação. Equipes que usam MessagePack em produção costumam adicionar um utilitário dedicado de decodificação ao seu ferramental interno e registrar os payloads decodificados na stack de observabilidade ao lado dos frames binários. O atrito no desenvolvimento é real - não o subestime.

Evolução de schema e versionamento

MessagePack é sem schema, como o JSON, então adicionar ou remover campos não quebra o formato. Porém, a ausência de schema significa que não há mecanismo de compatibilidade retroativa embutido além da verificação de campos em nível de aplicação. Para APIs em evolução, os tipos de extensão do MessagePack podem carregar metadados de versão de schema, mas isso exige design explícito. Para protocolos estritamente tipados e em evolução, a evolução de schema baseada em números de campo do Protobuf é mais robusta - veja a comparação JSON Schema vs Protobuf para a análise completa do trade-off.

O equalizador gzip

A compressão gzip HTTP muitas vezes fecha drasticamente a diferença entre JSON e MessagePack. APIs JSON com chaves repetitivas ao longo de elementos de array se comprimem extremamente bem, porque o gzip explora essa repetição. Uma resposta típica de API 40% menor como MessagePack puro pode ser apenas 5-10% menor depois que os dois formatos passam por gzip. Sempre faça benchmark de MessagePack comprimido contra JSON comprimido antes de se comprometer com uma migração.

Warning

Nunca adote MessagePack como uma mudança geral em toda a API sem fazer profiling. Meça o tamanho do payload e o tempo de serialização nos seus payloads reais de produção usando a ferramenta [Comparação de Tamanho JSON vs MessagePack](/tools/compress/json-compressors/json-vs-messagepack). Depois meça os mesmos payloads após a compressão gzip. Só avance se a comparação mostrar uma melhoria significativa que valha o custo de depuração.

Key takeaways

  • MessagePack é 20-50% menor que o JSON minificado em payloads típicos - a economia exata depende de quantos inteiros, booleanos e valores null o payload contém.
  • A velocidade de serialização é 2-4x maior que o JSON em texto nos benchmarks, mas bibliotecas JSON de alta performance como orjson (Python) e simdjson (C++) reduzem bastante essa diferença.
  • MessagePack adiciona tipos nativos que o JSON não tem: inteiros de 64 bits sem sinal, dados binários crus, float32 e tipos de extensão para timestamps e dados personalizados.
  • O maior trade-off prático é a depuração - a saída do MessagePack é binária e não pode ser lida diretamente no DevTools, no curl ou nos logs sem uma etapa de decodificação.
  • O JSON comprimido com gzip muitas vezes fecha a diferença de tamanho em relação ao MessagePack sem compressão - sempre faça benchmark dos dois sob gzip antes de migrar.
  • A ferramenta Comparação de Tamanho JSON vs MessagePack do Aback Tools mede a economia exata em bytes e o detalhamento por tipo de qualquer payload JSON em menos de um segundo.
  • Os melhores casos de uso são microsserviços internos de alto throughput, brokers de mensagens, APIs móveis com banda limitada e payloads que contêm dados binários crus.

Perguntas frequentes

O MessagePack é tipicamente 20-50% menor que o JSON minificado. A economia exata depende do formato do seu payload. Payloads com muitos inteiros, booleanos e valores null comprimem mais agressivamente - inteiros pequenos (0-127) ocupam 1 byte em MessagePack contra 1-3 bytes em texto JSON. Payloads dominados por strings longas ganham menos, porque as strings são armazenadas como bytes UTF-8 crus nos dois formatos. Use a ferramenta Comparação de Tamanho JSON vs MessagePack do Aback Tools para medir a economia exata do seu payload específico.

A serialização e deserialização com MessagePack é tipicamente 2-4x mais rápida que o processamento de JSON em texto nos benchmarks, porque o parsing binário dispensa a tokenização UTF-8 caractere por caractere exigida pelo JSON. A vantagem real de velocidade em produção depende muito do runtime e da biblioteca - parsers JSON de alta performance (simdjson em C++, orjson em Python) reduzem bastante a diferença. O ganho de performance é mais evidente em APIs de microsserviços de alto throughput que processam milhares de requisições por segundo.

O MessagePack suporta todos os tipos compatíveis com JSON: null, booleano, inteiro (com e sem sinal até 64 bits), float (32 e 64 bits), string UTF-8, array de bytes binário, array e map. Ele também suporta um mecanismo de tipos de extensão para tipos personalizados como timestamps, decimais e dados específicos da aplicação. Diferente do JSON, o MessagePack distingue strings de dados binários crus no próprio sistema de tipos - algo que o JSON não consegue expressar sem codificação base64.

Sim. O pacote npm @msgpack/msgpack fornece codificador e decodificador MessagePack compatíveis com navegador e com suporte completo a TypeScript. Porém, o MessagePack é um formato binário: não pode ser usado com o localStorage do navegador (que só armazena strings), nem enviado como corpo de texto simples, nem registrado de forma legível sem um visualizador hexadecimal. Para comunicação navegador-servidor, defina o cabeçalho Content-Type como application/msgpack e garanta que os dois lados usem a mesma versão da biblioteca para uma codificação consistente.

Em payloads muito pequenos (menos de 20 bytes), o MessagePack pode ter o mesmo tamanho ou ser ligeiramente maior que o JSON minificado. Isso acontece porque as tags de tipo do MessagePack adicionam 1 byte por valor e, em payloads minúsculos, esse overhead supera a compactação da codificação binária. Para um payload de campo único como {"ok":true}, o JSON ocupa 10 bytes e o MessagePack cerca de 8-9 bytes - diferença desprezível. A vantagem de tamanho cresce bastante com a complexidade e o tamanho do payload.

Não. O MessagePack é um formato binário - a saída codificada não é legível sem um decodificador dedicado ou visualizador hexadecimal. Esse é um dos principais trade-offs em relação ao JSON. Durante o desenvolvimento, depurar payloads MessagePack exige uma ferramenta que decodifique o binário para uma representação legível. A ferramenta Comparação de Tamanho JSON vs MessagePack do Aback Tools mostra os primeiros 64 bytes da saída MessagePack em hexadecimal, o que ajuda a verificar a correção da codificação sem uma etapa completa de decodificação.

Sim, mas exige configuração explícita no cliente e no servidor. O cliente deve enviar os cabeçalhos Accept: application/msgpack e Content-Type: application/msgpack, e o servidor precisa lidar tanto com JSON quanto com MessagePack para compatibilidade retroativa. A maioria dos frameworks REST (Express, FastAPI, Spring) suporta middleware de negociação de conteúdo personalizado. O ecossistema de GraphQL e OpenAPI em geral pressupõe JSON: adicionar MessagePack exige serializadores próprios e raramente compensa o custo de engenharia, a menos que o tamanho do payload seja um gargalo medido.

Os três são formatos de serialização binária mais compactos que o JSON. O Protobuf (do Google) usa uma definição de schema para eliminar totalmente os nomes de campos e alcança compressão de 5-10x em relação ao JSON - a maior densidade dos três, mas exige manter arquivos .proto. O MessagePack é sem schema como o JSON, o que o torna um substituto direto sem overhead de schema. O CBOR (RFC 7049) é um padrão da IETF com mais tipos de dados e melhor extensibilidade que o MessagePack. Para migrar uma API de JSON com o mínimo de atrito, o MessagePack é o ponto de partida mais simples.

ShareXLinkedIn