deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (native)

Go 1.27, daha katı ve daha hızlı JSON işlemeyle stabil encoding/json/v2'yi getiriyor

Go ekibi, encoding/json/v2 ve encoding/json/jsontext paketlerini Go 1.27 ile stabil ilan etti. Uyum sözleşmesi kapsamında düzeltilemeyen esnek ayrıştırma, nil'den null'a dönüştürme ve katı arayüzlerle dolu eski API böylece yavaş yavaş tarih oluyor.

Go 1.27, daha katı ve daha hızlı JSON işlemeyle stabil encoding/json/v2'yi getiriyor

Go'nun JSON elden geçirmesi Go 1.27 ile geldi

Go ekibi, yenilenmiş JSON yığınını stabil olarak işaretledi: Go 1.27 ile birlikte encoding/json/v2 ve encoding/json/jsontext paketleri genel kullanıma açıldı. Duyuru, 4 Kasım 2026 tarihli, Michael Pratt, Joe Tsai ve diğer beş katkıcıya atfedilen resmi Go blog gönderisinde yapıldı ve haber Hacker News'in ön sayfasına ulaştı. Gönderi, tasarımın henüz bir deneme olduğu geçen yılki makaleyi güncelliyor.\n Gönderiye göre JSON, internette en yoğun kullanılan veri biçimi ve Go, standart kütüphanesinde Go 1.0'dan bile önce JSON desteği sunuyor — ekip ilk kez bundan 15 yılı aşkın süre önce yazdı. Deneme üzerinden geri bildirim topladıktan sonra ekip, özgün encoding/json paketinin yerinde onarılamayacak sorunları olduğu sonucuna vardı.

encoding/json'daki davranış kusurları

Gönderi, eski paketin eksiklerini davranış kusurları ile API ve performans sınırları olarak grupluyor. Davranışla ilgili olarak:

  • Geçersiz UTF-8 kabul ediliyor; oysa JSON'un güncel İnternet Standardı olan RFC 8259 geçerli UTF-8 şart koşuyor. Eski paket bu tür girdiyi sessizce geçiriyor ve veriyi daha sonra ortaya çıkan biçimlerde bozuyor.

  • Yinelenen üye adlarına sahip nesneler kabul ediliyor. RFC 8259 yinelenen bir adın ne anlama geldiğini tanımlamıyor ve yazarlar, bu belirsizliğin bir saldırıda istismar edildiği örnek olarak CVE-2017-12635'e işaret ediyor.

  • Nil dilimler ve map'ler JSON null olarak marshalled ediliyor; bu da null'un beklenmediği, dizi ya da nesne beklenen yerde reddeden uygulamalarla birlikte çalışabilirliği bozuyor. Gönderide atıf yapılan bir anket, Go kullanıcılarının çoğunun varsayılan olarak boş dizi ya da nesne tercih edeceğini gösteriyor.

  • Unmarshalling sırasında üye adları, harf büyükliğine bakılmaksızın struct alanlarıyla eşleştiriliyor. Yazarlar bu varsayımı şaşırtıcı, bir güvenlik riski ve bir performans yükü olarak nitelendiriyor.

  • Pointer alıcılarında bildirilen MarshalJSON metotları tutarsız biçimde çağrılıyor. Ekip bunu bir hata olarak görüyor, ancak değiştirmek için çok fazla uygulamanın mevcut davranışa bağımlı olduğunu söylüyor.

API ve performans sınırları

Eski API ayrıca kısıtlayıcı. DisallowUnknownFields gibi seçenekler yalnızca Encoder ve Decoder tiplerinde var: düz Marshal ve Unmarshal işlevleriyle birleştirilemiyorlar ve özel bir UnmarshalJSON uygulaması devraldığında etkilerini yitiriyorlar. json.NewDecoder(r).Decode(v) ile ayrıştırma, JSON değerinden sonraki fazladan veriyi fark etmiyor. Compact, Indent ve HTMLEscape gibi biçimlendirme yardımcıları yalnızca bir bytes.Buffer'a yazabiliyor.

Performans, arayüz sözleşmeleriyle kısıtlanmış durumda. MarshalJSON ayrılmış bir []byte döndürmek zorunda ve paket bu çıktıyı doğrulayıp yeniden biçimlendirmek durumunda. UnmarshalJSON eksiksiz bir JSON değeri gerektirdiğinden, paket değerin sonunu bulmak için bir kez ayrıştırıyor ve metot onu yeniden ayrıştırıyor. Marshal ya da Unmarshal üzerinden yapılan özyinelemeli çağrılar kuadratik hâle geliyor. Encoder ve Decoder io.Writer ve io.Reader sarsa da değerlerin tamamı bellekte tamponlanıyor; token okuma metodu yoğun biçimde bellek ayırıyor ve token yazmak için bir karşılık yok.

Ekip, encoding/json'u doğrudan düzeltmeyi değerlendirdiğini ancak sorunların mevcut API'nin doğal sonuçları olduğunu ve Go 1 uyumluluk sözleşmesi içinde ele alınamayacağını söylüyor. Aynı pakete MarshalV2 gibi adlar eklemek, ilkinin yanında ikinci bir API büyütmek anlamına gelirdi; iş bu yüzden ayrı bir pakette sonuçlandı.

İki katmanlı bir yenileme

Yeniden tasarım, JSON işlemeyi iki katmana bölüyor. encoding/json/jsontext salt söz dizimini ele alıyor: JSON'un dil bilgisine göre kodlama ve kod çözme. Encoder ve Decoder'ı doğrudan io.Writer ve io.Reader üzerinde konumlanıyor; bütün değerler (WriteValue, ReadValue) ve tekil token'lar (WriteToken, ReadToken) için metotlarla, ayrıca Value, Token ve Kind tipleriyle birlikte. encoding/json/v2 bu temelin üzerine inşa ediliyor ve anlambilimi üstleniyor: marshalling ve unmarshalling, JSON değerleriyle Go değerleri arasındaki eşleme.

Gönderi, daha güvenli varsayılanların geçersiz UTF-8'i hata olarak bildirmek ve yinelenen üye adlarını, belirsiz girdinin rastgele bir yorumunu seçmek yerine reddetmek olduğunu savunuyor.

Neden önemli

Ağ üzerinden iletişim kuran neredeyse her Go programı JSON'a dokunuyor; dolayısıyla standart kütüphanenin varsayılanları, geniş bir ekosistemin güvenilmeyen girdiyi nasıl ayrıştıracağını şekillendiriyor. Geçersiz UTF-8'yi ve yinelenen adları reddetmek, en az bir belgelenmiş güvenlik açığına yol açmış belirsizliği ortadan kaldırıyor. Söz dizimini marshalling'den ayırmak, kütüphane yazarlarına düşük seviyeli, akış dostu bir temel veriyor ve arayüz sözleşmelerinin gözden geçirilmesi bellek ayırma ve çift ayrıştırma cezalarını kaldırıyor. Eski paket uyumluluk sözleşmesi kapsamında dokunulmadan kalıyor; bu nedenle ekipler için pratik soru, yeni kodun ne zaman v2'ye geçmesi gerektiği.

  • #go
  • #json
  • #standard-library
  • #api-design

İlgili yazılar