入力

出力

MessagePack to JSON とは

gRPC のサイドカーがリクエストボディを長い hex 文字列として吐き出していて、中身を読みたい。あるいは Redis から取り出した値を上流サービスが msgpack で保存していて、ターミナルには \x82\xa7orderId\xa8ORD-7421 と表示される。MessagePack はコンパクトなバイナリ形式で、通信には最適ですがログ行では読めません。このページは hex / base64 のダンプを受け取り、そこに含まれる JSON を返します。

デコードは 公式の MessagePack ワイヤーフォーマット仕様に従い、@msgpack/msgpack JavaScript ライブラリを使用しています。map はオブジェクト、array は配列、整数や浮動小数点はそのまま JSON の数値になり、結果は RFC 8259 に沿って整形されます。0x プレフィックス付き hex、\x エスケープ、スペース、カンマもそのままパースできます。base64(RFC 4648)の入力も自動で検出します。

アップロードなし、バックエンドなし、ログなし。デコードはブラウザ内で Uint8Array として処理されます。タブを閉じればバイトはなくなります。

MessagePack to JSON の使い方

貼り付け、読み、コピー。Convert ボタンはありません。タイプするたびに右側のパネルが更新され、300 ms のデバウンスでキー入力ごとに走り続けるのを防ぎます。

1

hex または base64 を貼る

MessagePack のバイトを左のエディタに入れます。形式は何でも OK:生の hex(82a7...)、スペース区切りの hex(82 a7 6f)、Python の \x エスケープ付きバイトリテラル、base64 のかたまりまで。サンプルを押すと、注文追跡用のペイロードが読み込まれ、実際のオブジェクトにデコードされます。

82a76f72646572496441 4f52442d3734323120a574 6f74616c cb4056600000000000

このスニペットは Order ペイロードの一部 — orderId、total、items、customer を含んでいます。デコード後は構造全体が JSON で戻ります。

2

右側で JSON を読む

右パネルは変更があるたびに再デコードします。バイトが正しい MessagePack ならオブジェクトが見えます。途中で切れていたり、ゴミが付いていたり、別フォーマット(CBOR、BSON)だった場合は、パーサーのエラーメッセージが表示されます。だいたいどこでおかしくなっているかは特定できます。

3

必要な部分をコピー

出力側の コピー ボタンで JSON を取り出せます。ユニットテストのフィクスチャに入れたり、バグチケットに貼ったり、別の整形にしたければ JSON フォーマッタ に通してください。逆方向(オブジェクト → msgpack)には JSON を MessagePack に を使ってください。

実際に使う場面

gRPC やサイドカーのログ本文を読む

サービスメッシュのサイドカーがリクエストボディを hex でダンプ。上流サービスが msgpack でシリアライズしているからです。hex を貼り付ければオブジェクトが見えて、その呼び出しに orderId: "ORD-7421"total: 89.50 が入っていたことを推測ではなく確認できます。

Redis の値を確認する

容量を節約するため Redis に msgpack コーデックでオブジェクトを保存している。スクリプトを書かずに session:42 の中身を見たい。GET して値をコピーし(多くのクライアントは hex か base64 で表示)、ここに貼ります。

キャッシュエントリをデコードする

小さなペイロード向けのキャッシュ — MessagePack、FlatBuffers、ときには生の protobuf — が今や至る所にあります。キャッシュされた blob が msgpack で、ライブの JSON と突き合わせたいとき、これが最速の比較ルートです。

クライアントが何を送っているかを検証する

帯域節約のためモバイルクライアントが msgpack でリクエストボディをエンコードしている。リグレッションが起きた。実際のバイトをキャプチャ(Charles、mitmproxy、ネットワークタブ)して貼り付け、フィールド名と値がサーバの期待するスキーマと一致するか確認します。顧客名 Ava Chen、商品 SKU-101 × 2 — 合っているかどうか。

よくある質問

入力したバイトはどこかにアップロードされますか?

いいえ。デコードはブラウザ内の純粋な JavaScript で行われます。@msgpack/msgpack ライブラリが入力を Uint8Array として読み込み、ワイヤーフォーマットを辿って結果のオブジェクトを JSON にレンダリングします。fetch も入力に対するアナリティクスもなく、タブの外には何も出ません。ローカル CLI ツールと同じ感覚で使えます。

hex と base64、どちらを貼っても大丈夫?

どちらでも動きます。ツールはまず hex を試します(ログ形式では 0x\x プレフィックス付きの hex、スペース、カンマが最も一般的なので)。hex として無効な場合は base64 にフォールバックします。Python の b'\x82\xa7order' バイトリテラルもデコード可能で、b'...' の囲みは取り除かれ、エスケープは展開されます。

タイムスタンプが奇妙な形で出るのはなぜ?

MessagePack には タイムスタンプ拡張型があり、ライブラリはこれを JS の Date にデコードします。JSON 文字列化すると ISO 8601 文字列になります。出力に "2026-05-05T12:34:56.000Z" のような文字列が見えたら、それはエンコーダが埋め込んだ本物のタイムスタンプであり、バグではありません。

入力が部分的にしか有効でない場合は?

デコーダはワイヤーフォーマットを 1 バイトずつ読みます。長さプレフィックスが「次は 16 バイトの文字列」と言っているのに 8 バイトしか残っていなければ、パースエラーを投げます。右パネルのエラーメッセージは、どの型トークンで失敗したかとおおよその位置を示すので、貼り付けが途中で切れているか、余計なバイトが混じっているかを見つけるのに通常十分です。

バイナリ blob(bin ファミリ)も扱えますか?

はい。bin 8/bin 16/bin 32 の値は Uint8Array のインスタンスとして戻ります。JSON にはネイティブのバイト型がないため、文字列化時には {"0":1,"1":2,...} のように表示されます。bin フィールドを base64 で扱いたい場合は、まずここでデコードしてから JSON を Base64 に で変換してください。

protobuf や CBOR との違いは?

MessagePack はスキーマレスです(キーがバイト列の中に入っています)。CBOR は近いですが型が多く、エンコードも異なります。protobuf はそもそもデコードに .proto スキーマが必要です。バイトが protobuf ならこのツールは失敗しますので、代わりに Protobuf を JSON に を試してください。CBOR ならワイヤーフォーマットは似ていますが同じではないので、CBOR 専用のデコーダが必要です。

その他の MessagePack ツール

このツールと組み合わせて使える MessagePack 関連ツール — 逆方向、検証、バイトを眺めるだけなど: