JSON akışı - JSON streaming
JSON akışı ,sunucu ve istemciler aynı olanı kullandığında (ör. örtük olarak kodlanmış) ayrı JSON nesnelerinin tanınmasını sağlayan,alt düzey akış yönelimli protokoller ( TCP gibi)üzerine inşa edilmiş JSON nesnelerini sınırlandırmak için iletişim protokollerini içerir. JSON birleştirici olmayan bir protokol olduğundan bu gereklidir (iki JSON nesnesinin birleştirilmesi geçerli bir JSON nesnesi üretmez).
Giriş
JSON, sistemler arasında nesne verisi alışverişi için popüler bir formattır. Sıklıkla, hisse senedi senedi veya uygulama günlüğü kayıtları gibi tek bir bağlantı üzerinden gönderilecek bir nesne akışına ihtiyaç vardır . Bu durumlarda, bir JSON kodlu nesnenin nerede bittiğini ve bir sonrakinin nerede başladığını belirlemeye ihtiyaç vardır. Teknik olarak bu çerçeveleme olarak bilinir .
Bunu başarmanın dört yaygın yolu vardır:
- Yeni satırlar olmadan biçimlendirilmiş JSON nesnelerini gönderin ve sınırlayıcı olarak yeni bir satır kullanın.
- Bir kayıt ayırıcı kontrol karakteriyle birleştirilmiş JSON nesnelerini sınırlayıcı olarak gönderin .
- Sınırlayıcı olmadan birleştirilmiş JSON nesnelerini gönderin ve bunları ayıklamak için bir akış ayrıştırıcısına güvenin.
- JSON nesnelerini uzunluklarıyla birlikte gönderin ve bunları ayıklamak için bir akış ayrıştırıcısına güvenin.
Satırla ayrılmış JSON
JSON akışının eşdeğer biçimleri için üç terim şunlardır:
- Satırla ayrılmış JSON (LDJSON),
- Yeni satırla sınırlandırılmış JSON (NDJSON) ve
- JSON satırları (JSONL)
Akış markaları (dizeleri olanlar olmalıdır JSON biçimi ilkel değerler dahilinde iade ve yeni satır karakterleri izin vermez gerçeğinin kullanmak kaçmış olarak \rve \nsırasıyla) ve dönüş ve yenisatırlar dahil herhangi boşluk dahil değil çoğu JSON biçemleyicileri varsayılan. Bu özellikler, yeni satır karakteri veya dönüş ve satırsonu karakter dizisinin sınırlayıcı olarak kullanılmasına izin verir.
Bu biçim ndjson.org'da belirtilir ve JSON Lines web sitesinde belgelenir .
Bu örnekte iki JSON nesnesi gösterilmektedir (her satırın sonundaki örtük yeni satır karakterleri gösterilmemiştir):
{"some":"thing\n"}
{"may":{"include":"nested","objects":["and","arrays"]}}
Sınırlayıcı olarak yeni satırın kullanılması, bu biçimin geleneksel satır yönelimli Unix araçlarıyla çok iyi çalışmasını sağlar .
Örneğin bir günlük dosyası şöyle görünebilir:
{"ts":"2020-06-18T10:44:12","started":{"pid":45678}}
{"ts":"2020-06-18T10:44:13","logged_in":{"username":"foo"},"connection":{"addr":"1.2.3.4","port":5678}}
{"ts":"2020-06-18T10:44:15","registered":{"username":"bar","email":"[email protected]"},"connection":{"addr":"2.3.4.5","port":6789}}
{"ts":"2020-06-18T10:44:16","logged_out":{"username":"foo"},"connection":{"addr":"1.2.3.4","port":5678}}
tarihe göre sıralamak çok kolay, kullanıcı adları, eylemler, IP adresleri vb. için grep .
Ayırıcıyla ayrılmış JSON'u kaydedin
Kayıt ayırıcıyla sınırlandırılmış JSON akışı, JSON biçimlendiricisinin boşlukları hariç tutması şartı olmadan JSON metin dizilerinin sınırlandırılmasına olanak tanır. JSON metin dizileri kontrol karakterleri içeremeyeceğinden , dizileri sınırlandırmak için bir kayıt ayırıcı karakter kullanılabilir. Ayrıca, kendi kendini sınırlamayan üst düzey JSON nesnelerinin (sayılar, doğru, yanlış ve boş) uygun şekilde işlenmesine izin vermek için her JSON metin sırasını bir satır besleme karakteriyle takip etmesi önerilir .
Bu biçim JSON Metin Dizileri veya MIME türü olarak da bilinir application/json-seqve IETF RFC 7464'te resmi olarak açıklanmıştır.
Aşağıdaki örnek, kayıt ayırıcı kontrol karakterini temsil eden ␞ ve satır besleme karakterini temsil eden ␊ olan iki JSON nesnesini göstermektedir:
␞{"some":"thing\n"}␊
␞{
"may": {
"include": "nested",
"objects": [
"and",
"arrays"
]
}
}␊
Birleştirilmiş JSON
Birleştirilmiş JSON akışı, gönderenin her JSON nesnesini sınırlayıcı olmadan akışa yazmasına olanak tanır. Sonlandırma karakteri ayrıştırılırken her JSON nesnesini tanıyabilen ve yayan bir ayrıştırıcı kullanan alıcıya güvenir . Birleştirilmiş JSON yeni bir biçim değildir, yalnızca herhangi bir sınırlayıcı olmadan birden çok JSON nesnesinin akışının adıdır.
Bu formatın avantajı, gömülü yeni satır karakterleriyle formatlanmış JSON nesnelerini işleyebilmesidir, örneğin, insan tarafından okunabilirlik için güzel basılmış . Örneğin, bu iki girdi hem geçerlidir hem de aynı çıktıyı üretir:
{"some":"thing\n"}{"may":{"include":"nested","objects":["and","arrays"]}}
{
"some": "thing\n"
}
{
"may": {
"include": "nested",
"objects": [
"and",
"arrays"
]
}
}
Satır tabanlı girdiye dayanan uygulamalar, nesnenin ayrıştırıcı tarafından zamanında yayınlanması için her JSON nesnesinden sonra bir satırsonu karakteri gerektirebilir. (Aksi takdirde satır, ayrıştırıcıya geçirilmeden giriş arabelleğinde kalabilir.) JSON nesnelerini yeni satır karakteriyle sonlandırmak çok yaygın olduğundan, bu nadiren bir sorun olarak kabul edilir.
Uzunluk ön ekli JSON
Uzunluk ön ekli veya çerçeveli JSON akışı, gönderenin her mesajın uzunluğunu açıkça belirtmesine olanak tanır. Alıcının, her bir n uzunluğunu tanıyabilen ve ardından JSON olarak ayrıştırmak için aşağıdaki n baytı okuyabilen bir ayrıştırıcı kullanmasına bağlıdır.
Bu biçimin avantajı, ayrıştırıcıyı sınırlayıcıları aramaya zorlamak yerine, her iletinin tam uzunluğunun açıkça belirtilmesi nedeniyle ayrıştırmayı hızlandırabilmesidir. Uzunluk ön ekli JSON, tek bir "mesajın" rastgele parçalara bölünebildiği TCP uygulamaları için de çok uygundur, çünkü ön ekli uzunluk ayrıştırıcıya bir JSON dizesini ayrıştırmaya çalışmadan önce tam olarak kaç bayt bekleyeceğini söyler.
Bu örnek, uzunluk ön ekli iki JSON nesnesini gösterir (her uzunluk, aşağıdaki JSON dizesinin bayt uzunluğudur):
18{"some":"thing\n"}55{"may":{"include":"nested","objects":["and","arrays"]}}
karşılaştırma
Çizgiyle ayrılmış JSON, geleneksel çizgiye yönelik araçlarla çok iyi çalışır .
Birleştirilmiş JSON, güzel basılmış JSON ile çalışır ancak ayrıştırmak için daha fazla çaba ve karmaşıklık gerektirir. Geleneksel çizgi odaklı araçlarla iyi çalışmaz. Birleştirilmiş JSON akışı, satırla ayrılmış JSON akışının bir üst kümesidir.
Uzunluk ön ekli JSON, güzel basılmış JSON ile çalışır. Geleneksel hat odaklı araçlarla iyi çalışmaz, ancak hatla ayrılmış veya birleştirilmiş akışa göre performans avantajları sunabilir. Ayrıca ayrıştırmak daha basit olabilir.
uyumluluk
Satırla ayrılmış JSON, birleştirilmiş JSON'u işleyebilen bir ayrıştırıcı tarafından okunabilir. Bir JSON nesnesi içinde yeni satırlar içeren birleştirilmiş JSON, satırla ayrılmış bir JSON ayrıştırıcısı tarafından okunamaz.
"Satırla ayrılmış JSON" ve "yeni satırla ayrılmış JSON" terimleri, gömülü yeni satırların desteklenip desteklenmediği açıklığa kavuşturulmadan sıklıkla kullanılır.
Geçmişte NDJ belirtimi ("yeni satırla ayrılmış JSON"), belirli bir satırın ilk iki karakteri "//" ise yorumların gömülmesine izin veriyordu. Yorumlar dahil edilmişse, bu standart JSON ayrıştırıcılarıyla kullanılamaz. Spesifikasyonun mevcut sürümü ("NDJSON - Yeni satırla sınırlandırılmış JSON") artık yorum içermiyor.
Birleştirilmiş JSON, jq gibi uygun bir JSON yardımcı programı tarafından satırla ayrılmış JSON'a dönüştürülebilir. Örneğin
jq --compact-output . < concatenated.json > lines.json
Uygulamalar ve araçlar
Satırla ayrılmış JSON
- jq , satırla ayrılmış JSON metinlerini hem oluşturabilir hem de okuyabilir.
- Jackson_(API) , satırla ayrılmış JSON metinlerini okuyabilir ve yazabilir.
- logstash bir json_lines codec bileşeni içerir .
- Node.js için ldjson-stream modülü
- NDJSON – Yeni satırla ayrılmış JSON Spesifikasyonu ile uyumlu Node.js için ld-jsonstream bağımlılıksız modül
- ArduinoJson , satırla ayrılmış JSON'u destekleyen bir C++ kütüphanesidir.
- RecordStream Satırla sınırlandırılmış JSON'u işlemek (oluşturmak, dönüştürmek, istatistik toplamak ve sonuçları biçimlendirmek) için bir dizi araç.
Ayırıcıyla ayrılmış JSON'u kaydedin
- jq , kayıt ayırıcıyla ayrılmış JSON metinlerini hem oluşturabilir hem de okuyabilir.
Birleştirilmiş JSON
- Node.js için concatjson birleştirilmiş JSON akış ayrıştırıcı/serileştirici modülü
- Jackson_(API) , birleştirilmiş JSON içeriğini okuyabilir ve yazabilir.
- jq hafif esnek komut satırı JSON işlemcisi
- Java için Noggit Solr'un akış JSON ayrıştırıcısı
- Yajl – Yine Bir Başka JSON Kitaplığı. YAJL, ANSI C ile yazılmış küçük bir olay güdümlü (SAX tarzı) JSON ayrıştırıcısı ve küçük bir doğrulayıcı JSON üretecidir.
- ArduinoJson , birleştirilmiş JSON'u destekleyen bir C++ kütüphanesidir.
- GSON JsonStreamParser.java, birleştirilmiş JSON'u okuyabilir.
Uzunluk ön ekli JSON
- missive Uzunluk ön ekli JSON mesajlarını akışlar üzerinden kodlamak ve kodunu çözmek için hızlı, hafif kitaplık
- Yerel mesajlaşma WebExtensions Yerel Mesajlaşma
Referanslar
- ^ Ryan, Film Tahıl. "Film Grain'i Nasıl İnşa Ettik, Bölüm 2/2" . filmgrainapp.com . Erişim tarihi: 4 Temmuz 2013 .
- ^ "JSON Hatları" .
- ^ "RFC7464" .
- ^ "Yeni Satırla Ayrılmış JSON" .
- ^ "NDJSON - Yeni satırla ayrılmış JSON" . 2 Haziran 2021.
- ^ "Monolog, Logstash ve Elasticsearch ile Merkezi Günlük Kaydı" .
- ^ "NDJSON - Yeni satırla ayrılmış JSON, akış protokollerinde JSON'u sınırlamak için bir standart" .