JSON.stringify ile eval bağlamında kaçış dizesi
Her şeyden önce: Kaçışla ilgili birçok soru olduğunu biliyorum, ancak şu ana kadar genel olarak çalışan bir cevap bulamadım. Gösteri için şu basit oyuncak işlevine sahip olduğumu varsayalım:
function f(somePOJO) {
var s = eval("'" + JSON.stringify(somePOJO) + "';"); // for demonstration only
return JSON.parse(s);
}
const clone = f({a: 1, b: "c"});
{a: 1, b: "c"}(POJO) gibi bir nesne verildiğinde f, onun bir "klonunu" döndürmelidir. (Bu yaklaşımı klonlama veya benzeri için gerçekten kullanmadığımı ve bunun evalkötü olduğunun farkındayım ve burada buna bile ihtiyaç olmadığını, sadece kaçan sorunun gösterilmesi için!)
Bu gayet iyi çalışıyor, ancak yalnızca POJO değerleri a içermediği sürece '. Şimdi tabii ki JSON'dan şu gibi bir şey kullanarak kaçabilirim JSON.stringify(somePOJO).replace(/'/g, "\\'"). Bu, POJO değerleri içeriyorsa ', ancak içeriyorsa işe yaramaz \\'. Ve bu bir kaçış sarmalı yaratır ...
Buna bir çözüm var mı?
Yanıtlar
Tarafından değerlendirilmektedir aracılığıyla bir JSON dizesi korumak için kaçış fonksiyon evalfonksiyonu, bazı durumlarda veya tarafından JavaScript derleyicisi JSON.parsefonksiyonu aslında JSON.stringify. Bu JSONyöntem, sadece nesne veri türlerini değil, dize değerlerini mutlu bir şekilde dizginleyecektir.
function f(somePOJO) {
var s = eval( JSON.stringify(JSON.stringify(somePOJO)) );
return JSON.parse(s);
}
const obj = {a: 1, b: "c", d: "back\\, forward/"}
const clone = f(obj);
console.log(obj);
console.log(clone);
escape/encodeURI/encodeURIComponentİşlev ailesinden biri olmamasının nedeni , bunların URL'lere dahil edilmek üzere karakterlerin kaçması içindir, oysa bu durum bir JavaScipt ayrıştırıcısı tarafından ayrıştırılacak karakterlerden kaçmakla ilgilidir.
Çoğu durumda, özellikle JSON metnini kullanarak JSON.parse, JSON metnini ikinci kez dizgilemek ve onu iki kez ayrıştırmak gereksizdir.
Şu anda biraz akademik ilgi JSONçekiyor, ancak Javascript'e girmeden önce, karakterlerini ve ters eğik çizgiden kaçan ters eğik çizgiyi, en az bir tür alıntı işaretini ve unicode kaçan kontrol kodlarını seri olarak inceleyerek bir dizeyi dizgiye çevirmek mümkün olabilir - gönderilen soru parça eksik olabilir ters eğik çizgi karakterlerinden ve tırnak işaretlerinden kaçınma ihtiyacı hakkında.