Giriş

Çıkış

JSON’dan MessagePack’e nedir?

Sıkı bir WebSocket bütçesinden geçecek bir JSON yapılandırman var — MessagePack aynı yükü JSON olarak göndermeye kıyasla %30-60 küçültür ve bunu, JSON’u kullanmayı keyifli kılan o şemasız "sadece bir nesne" hissinden vazgeçmeden yapar. Bu sayfa solda yapıştırdığın JSON’u sağda bir msgpack bayt akışına kodlar; varsayılanda base64 olarak sunulur, tek tıkla hex’e geçirilebilir.

Kodlama tamamen tarayıcında, resmî @msgpack/msgpack kütüphanesiyle çalışır, dolayısıyla JSON sekmeyi hiç terk etmez. Kapakların altında girdiyi JSON.parse ile çözüyoruz (bu da JSON RFC’sinin tarif ettiği parser), sonuçta çıkan nesneyi msgpackEncode’a veriyoruz ve dönen Uint8Array’i taşımaya uygun bir dizgeye çeviriyoruz — base64 (RFC 4648’e göre) veya küçük harfli hex.

Baytları JSON içine, HTTP başlığına ya da bir veritabanı alanına gömüyorsan base64’ü kullan. Bir örneği msgpack wire spec’iyle ya da bir sunucu logu ile bayt bayt karşılaştırıyorsan hex’i kullan. Aynı baytlar, farklı gösterim.

JSON’dan MessagePack’e kodlayıcısı nasıl kullanılır

Üç adım. Yazdıkça çevrim otomatik çalışır — tıklanacak bir buton yok.

1

JSON yapıştır veya örneği yükle

JSON’unu sol editöre bırak. Örnek JSON’a basınca önemli durumları kapsayan küçük bir sipariş yükü gelir — string’ler, tam sayılar, ondalıklar ve iç içe geçmiş bir dizi. Kodlayıcı girdiyi standart MessagePack tip sistemine göre işler: tam sayılar sığan en küçük fixint/int8/int16/int32/int64 biçimine, ondalıklar float64’e, string’ler uzunluğa göre fixstr/str8/16/32’ye, diziler fixarray/array16/32’ye ve haritalar fixmap/map16/32’ye gider. Örnek girdi:

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

Bunun gibi 90 baytlık bir JSON tipik olarak ~55 bayt msgpack’e iniyor — herhangi bir gzip katmanı eklenmeden önce üçte bir daha küçük.

2

Hex veya Base64 arasında geçiş yap

Çıktı biçimi varsayılan olarak base64’tür çünkü bir yapılandırmaya yapıştırırken ya da hat üzerinden gönderirken çoğunlukla bunu kullanırsın. Sunucu tarafı bir kodlayıcıyla diff alıyor ya da tip baytlarını gözle kontrol ediyorsan (örn. 2’li fixmap için 0x82) Hex çıktı’ya tıklayıp küçük harfli hex’e geç. İstediğin kadar geçiş yap — alttaki baytlar aynı.

3

Kopyala ve gönder

Kopyala’ya basıp çıktıyı panona al. Doğrudan bir Redis SET’ine, bir WebSocket text frame’ine, Content-Type: application/x-msgpack başlıklı bir HTTP gövdesine ya da bir Postgres bytea sütununa (önce base64’ü çöz) at. Diğer yöne geçmek için MessagePack’tan JSON’a sayfamıza yapıştır.

Bunu gerçekten ne zaman kullanırsın

WebSocket frame’lerini küçült

Saniyede gevezelik eden gerçek zamanlı uygulamalar boyut farkını hisseder. JSON’da 220 bayt olan bir konum güncellemesi ya da emir defteri tick’i msgpack’te ~140 bayta düşer — saniyede binlerce frame’de bu birikir. Bir örnek mesajı burada dönüştür, baytları test koşum takımına yapıştır ve alıcının aynı şekilde çözdüğünü doğrula.

Önbellek değerlerini sıkıştır

Redis gibi önbellekler her saklanan ve her okunan bayt için sana fatura keser. Önbelleğe alınan nesneleri JSON-stringified metin yerine msgpack ile kodlamak her isabette depolama ve ağdan tasarruf sağlar. Belirli bir nesnenin bayt olarak nasıl göründüğünü serializer’ında kodlamayı sabitlemeden önce bu sayfada kontrol et.

Tipli sayılar gönder

JSON’un tek bir sayısal tipi vardır ve 42 ile 42.0 aynıdır. MessagePack hat üzerinde tam sayı ile float’ı ayırır — alıcı Go, Rust ya da C# gibi sıkı tipli bir dilse ve bir string üzerinden gidip dönmek istemiyorsan işine yarar. Bir JSON sayısı yapıştır ve hex çıktıdaki tip baytına bakarak float değil int olarak kodlandığını doğrula.

Bir decoder’ı debug et

"msgpack olması gereken" bir servisin var ama tüketici baytlara takılıyor mu? Aynı JSON’u burada kodla, servisinin çıktısını bizimkiyle hex modunda bayt bayt karşılaştır; sapma sana hangi alanın ya da tipin yanlış olduğunu birebir söyler. Referans encoder yayınlanmış spec’i harfiyen takip eder.

Sık sorulan sorular

JSON tarayıcımdan dışarı çıkıyor mu?

Hayır. JSON tarayıcının yerleşik JSON.parse’ı ile parse edilir, istemci tarafı JavaScript’teki @msgpack/msgpack kütüphanesi ile kodlanır ve sağ panelde base64 ya da hex olarak render edilir — sunucu çağrısı yok, girdi üzerinde telemetri yok, hiçbir şey loglanmaz. DevTools’u açıp yazarken Network sekmesinin sessiz kaldığını kendin görebilirsin. Tescilli yapılandırmalar ve müşteri verisi için güvenlidir.

Çıktı neden beklediğimden büyük?

Genelde iki sebep. Birincisi, base64 bayt sayısını yaklaşık %33 şişirir — base64-msgpack’i doğrudan JSON metniyle karşılaştırıyorsan gerçek hat boyutunu karşılaştırmıyorsun demektir. Hex’e (o da 2x şişirir) geç ya da daha iyisi bayt uzunluğuna bak: DevTools’ta atob(output).length sana gerçek boyutu verir. İkincisi, msgpack JSON’u ancak veride çok sayıda sayı, boolean ya da tekrar eden kısa string olduğunda yener. %90’ı uzun ve benzersiz string’lerden oluşan bir blob iki biçimde de yaklaşık aynı boyutta olur.

Tam sayılar, ondalıklar ve büyük sayılar nasıl ele alınıyor?

JavaScript’in JSON.parse’ı her sayıyı 64 bit float’a çevirir, dolayısıyla veri encoder’a ulaştığında int-float ayrımını çoktan kaybetmiş oluyoruz. Kütüphane bu konuda mantıklı davranır: tam sayı olan ve safe-int aralığında bulunan bir değer int olarak (sığan en küçük varyantta — fixint, int8, int16, int32 veya int64) kodlanır. Geri kalanı float64 olur. Snowflake ID gibi tam 64-bit int’lere ihtiyacın varsa, JSON’dan string olarak geçir ve alıcıda dönüştür.

Bununla ikili blob’ları (örn. dosya baytlarını) kodlayabilir miyim?

Doğrudan JSON üzerinden hayır — JSON’un bin tipi yok, bu yüzden bir Uint8Array bu UI’dan base64 string olarak geçer ve msgpack’in str’ı olarak yeniden kodlanır, bin olarak değil. Gerçek msgpack bin ya da ext tiplerine (msgpack’e özgü iki büyük özellik) ihtiyacın varsa, nesneyi kodda kurman ve doğrudan içine bir Uint8Array koyup encode çağırman gerekir. JSON paneli, verinin zaten JSON şeklinde olduğu %90’lık duruma yöneliktir.

Hex ve base64 çıktısı arasındaki fark nedir?

İkisi de aynı baytları metin olarak yazmanın iki yolu. Hex bayt başına iki karakterdir (yani 0x82 "82" string’i olur) — spec’teki tip baytlarını gözle okumak için faydalı. Base64 ise RFC 4648’e göre üç bayta dört karakterdir — daha yoğun ve JSON, JWT ya da HTTP başlıklarına ikili veri gömmenin standart yoludur. Çıktıyı yapıştıracağın yere uyanı seç.

msgpack JSON’dan gerçekten daha mı hızlı, yoksa sadece daha mı küçük?

Genelde küçük olmak daha büyük kazançtır. Encode/decode hızında modern JSON.parse öyle iyi optimize edilmiş ki JS’te msgpack ya başa baş gider ya da %10-20 öne geçer. Serileştirme kazancı aşağı akışta görünür: daha küçük yükler, daha az ağ süresi ve alıcı, JSON parse’ı msgpack parse’ından pahalı bir dildeyse (sana bakıyorum, Python) ona daha az iş demektir. Pratik kural: darboğaz bant genişliği veya depolama ise msgpack’i seç; okunurluk ve araç ekosistemi ise JSON’da kal.

Diğer MessagePack araçları

Kodlama tek yön. Bunlar gidiş-dönüşün kalanını kapsar: