JSON Stringify / Unstringify

Bir JSON nesnesini kod içine gömülecek tek satırlık tırnaklı dizeye kaçışlayın veya kaçışlı bir JSON dizesini okunur JSON'a geri çözün.

1.016 görüntülenme

Nasıl Çalışır

Stringify gerçek JSON'u alır, tek satırlık tırnak-kaçışlı bir dize değişmezine kodlar — JSON'u başka bir JSON alanına, ayar değerine veya kaynak koddaki bir dize sabitine gömerken ihtiyaç duyduğunuz biçim budur. Bu, aslında JavaScript'in JSON.stringify() fonksiyonunun tam olarak yaptığı şeydir: değeri gezer, dizeleri tırnaklar, kontrol karakterlerini ve iç içe geçmiş tırnakları kaçışlar, nesneleri ve dizileri metne dönüştürür. Unstringify tersini yapar: kaçışlı bir JSON dizesini (\" ve \n ile) yapıştırın; bu, üzerinde JSON.parse() çağırıp sonucu okunur biçimde yazdırmaya denktir — temiz, okunur, girintili JSON alırsınız.

Somut örnek: {"name":"Ada","tags":["a","b"]} nesnesi "{\"name\":\"Ada\",\"tags\":[\"a\",\"b\"]}" dize değişmezine dönüşür — her iç çift tırnağın önüne bir ters eğik çizgi eklenir, böylece bütün ifade tek bir dış tırnak çifti içinde yaşayabilir. Bir API, JSON yükünü başka bir JSON yanıtı içinde dize olarak sardığında (bir webhook gövdesi, bir log satırı, metin türünde bir veritabanı sütunu) veya bir JSON değeri çevresindeki söz dizimini bozmadan bir YAML dosyasına, bir ortam değişkenine ya da kaynak koddaki bir dize sabitine yerleştirilmesi gerektiğinde tam olarak bu olur. Unstringify tersini yapar: o kaçışlı parçayı yapıştırın, orijinalini girintili ve okunur halde geri alın.

JSON.stringify()'ın birkaç davranışı, bu aracın tam olarak bu işlevi kullanmasanız bile bilinmeye değer: bir nesnenin özelliklerinde undefined değerler ve fonksiyonlar sessizce atlanır (değeri undefined olan bir anahtar basitçe kaybolur), ama aynı değerler bir dizi içinde olduğunda atlanmak yerine null'a dönüştürülür, çünkü diziler uzunluklarını ve indeks konumlarını korumak zorundadır. Date nesneleri nesne olarak serileştirilmez — toJSON() yöntemleri aracılığıyla "2024-01-15T10:30:00.000Z" gibi bir ISO 8601 dizesine dönüştürülürler. Ve dairesel referans (circular reference) içeren bir değer — kendisine doğrudan veya bir özellik zinciri üzerinden geri dönen bir nesne — hiç stringify edilemez: gerçek JSON.stringify() bir TypeError: Converting circular structure to JSON hatası fırlatır, çünkü sonsuz iç içe geçmiş bir yapıyı temsil edebilecek sonlu bir dize yoktur.

Bilinmesi Gerekenler

Stringify işlemi belirli bir anlamda kayıplıdır: sessizce atlanan her şey (fonksiyonlar, undefined özellikler, Symbol anahtarları) sonradan unstringify ile geri getirilemez — gidiş-dönüş yalnızca geçerli JSON'ın zaten temsil edebildiği şeyleri korur: dizeler, sayılar, boolean değerler, null, düz nesneler ve diziler. Gerçek kodda JSON.stringify(), değerin kendisinin ötesinde iki ek argüman daha kabul eder: hangi özelliklerin dahil edileceğini veya değerlerinin serileştirilmeden önce nasıl dönüştürüleceğini kontrol eden bir replacer (bir fonksiyon veya anahtar adları dizisi), ve sıkışık tek satırlık çıktıyı girintili, okunabilir JSON'a çeviren bir space parametresi (bir sayı veya dize) — bu tam olarak küçültülmüş bir API yanıtı ile bir hata ayıklayıcının size gösterdiği okunaklı biçimlendirilmiş sürüm arasındaki farktır.

Çift kodlanmış JSON, yaygın bir kafa karışıklığı kaynağıdır: bir değer JSON dizesi gibi görünüyor ama ilk karakteri bir tırnak işareti ve ters eğik çizgiyle kaçışlanmış iç tırnaklarla doluysa, muhtemelen iki kez stringify edilmiştir — bir kez uygulama tarafından, bir kez daha yükün zaten bir JSON dizesi olduğunu fark etmeyen bir katman tarafından. Bunu bir kez unstringify'dan geçirmek dış katmanı çözer; sonuç hâlâ kaçışlı görünüyorsa tekrar çalıştırın.

Sıkça Sorulan Sorular

Koddaki JSON.stringify'dan farkı ne?

Aynı işlem, yalnız etkileşimli araç olarak: gerçek JSON yapıştırın, aksi halde JSON.stringify(obj) yazarak üreteceğiniz kaçışlı dize halini alın — elinizde konsol yokken kullanışlıdır.

JSON'u ne zaman unstringify etmem gerekir?

API'ler ve günlükler bazen bir JSON dizesini başka bir JSON alanının içine yerleştirir (çift kodlu JSON) — unstringify o iç kaçışlı dizeyi okunur, ayrıştırılabilir JSON'a geri çevirir.

Stringify ettikten sonra bir özellik neden kayboldu?

JSON.stringify(), değeri undefined veya bir fonksiyon olan nesne özelliklerini sessizce atlar — ikisinin de JSON karşılığı yoktur, bu yüzden anahtar null olarak değil, tamamen silinerek serileştirilir. Aynı undefined değer bir dizi içindeyse kaybolmak yerine null'a dönüşür, çünkü diziler uzunluklarını ve indeks sırasını korumak zorundadır.

"Circular structure" (dairesel yapı) hatası neden alıyorum?

Bir nesne, doğrudan veya başka nesneler zinciri üzerinden kendisine referans veriyorsa, JSON.stringify() onun için sonlu bir dize üretemez ve bir TypeError fırlatır. Bu, ebeveynine geri referans tutan nesneleri serileştirirken yaygındır (kendi ağacına işaret eden bir alt düğüm, bir DOM elemanı, "self" alanlı bir sınıf örneği) — çözüm, serileştirmeden önce dairesel özelliği bir replacer fonksiyonuyla çıkarmak veya değiştirmektir.

Verim yükleniyor mu?

Hayır — iki yön de tarayıcınızda yerel çalışır.

Yorumlar

Henüz yorum yok — ilk yorumu siz yazın!

Benzer Araçlar