Wejście

Wyjście

Czym jest JSON do MessagePack?

Masz JSON-ową konfigurację, która zaraz pójdzie wąskim WebSocketem — MessagePack ściska ten sam payload o 30-60% w porównaniu do JSON-a, i robi to bez rezygnacji z bezschemowego, „to po prostu obiekt” charakteru, który czyni JSON wygodnym w pracy. Ta strona koduje JSON wklejony po lewej w strumień bajtów msgpack po prawej — domyślnie jako base64, jednym kliknięciem przełączasz na hex.

Kodowanie odbywa się w całości w przeglądarce, przez oficjalną bibliotekę @msgpack/msgpack, więc JSON nigdy nie opuszcza karty. Pod spodem parsujemy wejście za pomocą JSON.parse (tego samego parsera, który opisuje RFC JSON-a), wynikowy obiekt podajemy do msgpackEncode, a zwrócony Uint8Array zamieniamy na string przyjazny do transportu — base64 (zgodnie z RFC 4648) albo hex małymi literami.

Sięgaj po base64, gdy osadzasz bajty w JSON-ie, nagłówku HTTP lub kolumnie bazy. Sięgaj po hex, gdy porównujesz próbkę bajt po bajcie ze specyfikacją wire msgpacka albo logiem serwera. Te same bajty, inny zapis.

Jak korzystać z kodera JSON do MessagePack

Trzy kroki. Konwersja chodzi automatycznie podczas pisania — żadnego przycisku do kliknięcia.

1

Wklej JSON albo wczytaj próbkę

Wrzuć swój JSON do lewego edytora. Naciśnij Przykładowy JSON, a dostaniesz mały payload zamówienia, który ćwiczy ważne przypadki — stringi, liczby całkowite, liczby zmiennoprzecinkowe i zagnieżdżoną tablicę. Koder traktuje wejście zgodnie ze standardowym systemem typów MessagePack: liczby całkowite trafiają do najmniejszej pasującej formy fixint/int8/int16/int32/int64, zmiennoprzecinkowe stają się float64, stringi w zależności od długości to fixstr/str8/16/32, tablice używają fixarray/array16/32, a mapy fixmap/map16/32. Przykład wejścia:

{
  "orderId": "ORD-7421",
  "items": [{ "sku": "SKU-101", "qty": 2 }],
  "total": 89.50
}

90-bajtowy JSON jak ten zwykle koduje się do ~55 bajtów msgpacka — o jedną trzecią mniej, jeszcze przed jakąkolwiek warstwą gzipa na wierzchu.

2

Przełącz hex albo base64

Format wyjścia domyślnie to base64, bo zwykle właśnie to wkleja się do konfiguracji albo wysyła po sieci. Kliknij Wyjście hex, żeby przełączyć na hex małymi literami, jeśli robisz diff z koderem po stronie serwera albo chcesz wzrokowo sprawdzić bajty typów (np. 0x82 dla fixmapy o 2 elementach). Przełączaj, ile chcesz — bajty pod spodem są te same.

3

Skopiuj i wyślij

Naciśnij Kopiuj, żeby przenieść wynik do schowka. Wstaw bajty wprost do SET-a Redisa, ramki tekstowej WebSocketa, ciała HTTP z Content-Type: application/x-msgpack albo do kolumny bytea Postgresa (najpierw zdekoduj base64). W drugą stronę — wklej wynik na naszej stronie MessagePack do JSON.

Kiedy faktycznie tego użyjesz

Skurczyć ramki WebSocketa

Aplikacje real-time z gadatliwymi aktualizacjami co sekundę czują różnicę w rozmiarze. Aktualizacja pozycji albo tick księgi zleceń ważący 220 bajtów jako JSON spada do ~140 bajtów jako msgpack — przy tysiącach ramek na sekundę to się kumuluje. Skonwertuj tu jedną przykładową wiadomość, wklej bajty do swojego harness-a testowego i sprawdź, czy odbiorca dekoduje je tak samo.

Spakować wartości w cache

Cache w stylu Redisa kasują cię za każdy zapisany i każdy odczytany bajt. Kodowanie obiektów cache’owanych jako msgpack zamiast JSON-stringified oszczędza pamięć i sieć przy każdym hicie. Skorzystaj z tej strony, żeby zerknąć, jak dany obiekt wygląda jako bajty, zanim wpiszesz konkretne kodowanie do swojego serializera.

Wysyłać liczby z typem

JSON ma jeden typ liczbowy i traktuje 42 tak samo jak 42.0. MessagePack rozróżnia int i float już na drucie — przydaje się, gdy odbiorcą jest mocno typowany język w stylu Go, Rusta albo C# i nie chcesz robić objazdu przez stringa. Wklej liczbę JSON i sprawdź bajt typu w wyjściu hex, żeby potwierdzić, że został zakodowany jako int, a nie float.

Zdebugować dekoder

Masz serwis, który „ma być” msgpackiem, ale konsument dławi się bajtami? Zakoduj ten sam JSON tutaj, porównaj wyjście swojego serwisu z naszym bajt po bajcie w trybie hex, a rozjazd pokaże ci dokładnie, które pole albo typ jest źle. Koder referencyjny trzyma się opublikowanej specyfikacji co do litery.

Częste pytania

Czy JSON wychodzi z mojej przeglądarki?

Nie. JSON parsuje wbudowany w przeglądarkę JSON.parse, koduje go biblioteka @msgpack/msgpack w JavaScripcie po stronie klienta, a wynik renderuje się jako base64 albo hex w prawym panelu — żadnego wywołania serwera, żadnej telemetrii na wejściu, nic nie jest logowane. Możesz otworzyć DevTools i potwierdzić, że karta sieci milczy podczas pisania. Bezpieczne dla wewnętrznych konfiguracji i danych klientów.

Dlaczego wynik jest większy, niż się spodziewałem(am)?

Zwykle dwa powody. Po pierwsze, base64 puchnie liczbę bajtów o jakieś 33% — jeśli porównujesz msgpacka-w-base64 z czystym tekstem JSON, to nie porównujesz prawdziwego rozmiaru na drucie. Przełącz na hex (ten puchnie 2x) albo, jeszcze lepiej, popatrz na długość w bajtach: w DevTools atob(output).length da ci rzeczywisty rozmiar. Po drugie, msgpack wygrywa z JSON-em tylko wtedy, gdy w danych jest dużo liczb, booleanów albo powtarzających się krótkich stringów. Blob złożony w 90% z długich, unikalnych stringów wyjdzie mniej więcej tak samo w obu formatach.

Jak są obsługiwane liczby całkowite, zmiennoprzecinkowe i wielkie liczby?

JSON.parse w JavaScripcie zamienia każdą liczbę na 64-bitowy float, więc zanim dane dotrą do kodera, rozróżnienie int kontra float już zostało utracone. Biblioteka radzi sobie z tym sensownie: wartość, która jest całkowita i mieści się w zakresie safe-int, koduje się jako int (w najmniejszej pasującej odmianie — fixint, int8, int16, int32 lub int64). Reszta idzie jako float64. Jeśli potrzebujesz dokładnych 64-bitowych intów (np. Snowflake ID), przemycaj je przez JSON jako stringi, a po stronie odbiorcy konwertuj.

Czy mogę tym kodować binarne bloby (np. bajty pliku)?

Bezpośrednio przez JSON nie da się — JSON nie ma typu bin, więc Uint8Array zrobi rundkę przez to UI jako string base64 i zostanie zakodowany na nowo jako msgpack-owy str, a nie bin. Jeśli potrzebujesz prawdziwych typów bin albo ext z msgpacka (dwie duże, ekskluzywne dla msgpacka funkcje), musisz zbudować obiekt w kodzie i wywołać encode bezpośrednio z Uint8Array-em w środku. Panel JSON jest do 90% przypadków, w których dane już mają kształt JSON-owy.

Jaka jest różnica między wyjściem hex i base64?

To dwa sposoby zapisania tych samych bajtów jako tekst. Hex to dwa znaki na bajt (czyli 0x82 staje się stringiem "82") — przydatne do wzrokowego czytania bajtów typów ze specki. Base64 to cztery znaki na trzy bajty zgodnie z RFC 4648 — gęściej, i to standardowy sposób na osadzanie binarki w JSON-ie, JWT-kach albo nagłówkach HTTP. Wybierz to, co pasuje do miejsca, w które wklejasz wynik.

Czy msgpack jest faktycznie szybszy od JSON-a, czy tylko mniejszy?

Mniejszy zwykle jest większą wygraną. Co do prędkości kodowania/dekodowania — nowoczesny JSON.parse jest tak zoptymalizowany, że w JS msgpack remisuje albo wygrywa o jakieś 10-20%. Korzyść z serializacji widać w dół rurociągu: mniejsze payloady to mniej czasu w sieci i mniej pracy dla odbiorcy, jeśli stoi na języku, w którym parsowanie JSON-a kosztuje więcej niż parsowanie msgpacka (Python, patrzę na ciebie). Reguła kciuka: bierz msgpacka, jeśli wąskim gardłem jest pasmo albo storage; zostań przy JSON-ie, gdy chodzi o czytelność i ekosystem narzędziowy.

Inne narzędzia MessagePack

Kodowanie to jeden kierunek. Te narzędzia pokrywają resztę podróży w obie strony: