MessagePack ↔ JSON
Decodifique um payload MessagePack para JSON, ou codifique JSON para MessagePack, com comparação de tamanho em bytes. Aceita hex, Base64 ou um arquivo .msgpack. Só no navegador.
Carregando a ferramenta…
E agora?
Perguntas frequentes
Por que o MessagePack costuma pesar menos que o JSON equivalente?
O JSON gasta bytes com sintaxe que não carrega dado nenhum: cada chave de texto se repete por inteiro entre aspas em cada objeto, cada número é escrito como dígitos decimais, e os caracteres estruturais ({, }, [, ], ,, :) se acumulam num documento grande. O MessagePack troca tudo isso por um byte de cabeçalho de tipo seguido direto do valor bruto — um inteiro pequeno costuma custar um único byte em vez de vários dígitos ASCII, e uma string curta custa seu tamanho em bytes mais um byte de cabeçalho, em vez disso mais duas aspas. A linha de comparação de tamanho abaixo do resultado (sizeComparison) mostra exatamente quanto foi economizado para o que você colou; a porcentagem exata depende muito de quantos números e chaves curtas seu dado tem em relação a strings longas — com textos longos, os dois formatos ficam mais parecidos. Essa eficiência é justamente por que o MessagePack é usado como formato de transporte em sistemas onde o tamanho da mensagem importa em volume — filas de eventos de alta vazão, comunicação entre microsserviços, ou o próprio protocolo interno do Fluentd — mais do que como um formato pensado para edição manual.
Se eu colar vários valores MessagePack colados um atrás do outro, a ferramenta pega só o primeiro?
Não. É um comportamento bom de saber de antemão: a função decode() da biblioteca @msgpack/msgpack aceita exatamente um valor MessagePack independente, nada além disso. Se o que você colou na verdade são vários valores concatenados — algo comum ao copiar dados de um fluxo de log ou de um transporte com quadros prefixados por tamanho — a ferramenta lança um erro (código decodeFailed, com o detalhe real da falha de decodificação) em vez de silenciosamente pegar o primeiro valor e ignorar o resto. O certo é separar o payload em valores individuais antes de colar aqui, ou remover o framing externo, se houver. A mesma mensagem de erro também aparece, com um detalhe diferente, para qualquer outro payload que simplesmente não seja MessagePack válido — por exemplo, texto colado por engano no campo errado.
O que é a "extensão de timestamp" e por que ela aparece como uma data legível?
Os tipos básicos do MessagePack — string, integer, float, boolean, array, map, binary, nil — não incluem um conceito nativo de "momento no tempo". A revisão da especificação de agosto de 2017 adicionou um tipo de extensão reservado (tipo -1) justamente para isso, empacotando segundos e nanossegundos desde o epoch Unix em 4, 8 ou 12 bytes dependendo do intervalo necessário. O decodificador da biblioteca usada por esta ferramenta reconhece essa extensão automaticamente e a transforma num objeto Date do JavaScript; como o JSON.stringify chama Date#toJSON ao serializar, o resultado já sai como uma data ISO 8601 legível no JSON de saída, sem nenhum tratamento extra no código da ferramenta.
Existe limite de tamanho para o que posso colar ou enviar?
Sim, 10 MB. Tudo roda na sua aba do navegador em vez de num servidor, e analisar dezenas de megabytes de texto hex ou base64 num único campo de entrada é exatamente o tipo de operação capaz de travar a aba visivelmente. Um payload acima desse limite é rejeitado antes de a decodificação começar (error_payloadTooLarge), não é cortado nem processado parcialmente. Se precisar inspecionar algo maior, uma ferramenta de linha de comando para MessagePack que processe o fluxo aos poucos é mais adequada do que uma baseada no navegador.
Ao ir e voltar pelo JSON, alguma distinção que o MessagePack tinha se perde?
Sim. O JSON tem um sistema de tipos bem mais estreito que o MessagePack. O MessagePack separa bin (binário bruto) de str (texto) como dois tipos de wire distintos, e distingue 15 larguras diferentes de inteiro (de um fixint de um byte até um int/uint completo de 64 bits) do tipo de ponto flutuante. O JSON tem exatamente um tipo de string e um tipo de número — então, ao recodificar para MessagePack depois de um round-trip pelo JSON, a ferramenta não consegue recuperar qual largura exata de inteiro ou qual distinção binário-vs-texto o payload original tinha. Se preservar essa distinção importa para você, trabalhe direto sobre o payload binário original em vez de passar pelo JSON intermediário.
A ferramenta entende qualquer tipo de extensão, não só o timestamp?
Não, e isso é proposital. A especificação do MessagePack deixa os tipos 0 a 127 livres para cada aplicação definir seu próprio significado — só o tipo -1 (timestamp) é reservado pela especificação; o resto não tem nenhuma convenção universal. Sem saber qual convenção a aplicação que gerou o payload usou, a ferramenta mostra o número de tipo e os bytes brutos de uma extensão não reconhecida, em vez de arriscar uma decodificação que quase certamente estaria errada para o seu produtor específico.
Mais ferramentas de Conversores
- Conversor de Numerais RomanosConvert between Roman numerals and numbers, both directions. Rejects readable-but-invalid forms like IIII and IM.
- Criar ZIPJunte vários arquivos num .zip, com o nível de compressão que escolher. Roda no navegador.
- Descompactar ArquivoAbra um .zip, .7z, .rar, .tar ou .tar.gz e retire os arquivos que precisa. Roda no navegador.
- Conversor JSON ↔ YAML ↔ TOMLConverte entre JSON, YAML e TOML. Detecta o formato de entrada automaticamente. Só no navegador.
- Conversor CSV ↔ JSONConverte entre CSV e JSON. Detecta o delimitador, trata aspas e linha de cabeçalho. Só no navegador.
- Conversor Markdown ↔ HTMLConverte Markdown em HTML e vice-versa. Compatível com GFM (tabelas, listas de tarefas). Só no navegador.