Bir değer yeni çizgi karakteri olan bir JSON dize oluşturmak zorunda. Bundan kaçınmalı ve ardından AJAX çağrısı kullanılarak gönderilmelidir. Herhangi biri JavaScript ile dizeden kaçmanın bir yolunu önerebilir. Ben jQuery kullanmıyorum.
Bir değer yeni çizgi karakteri olan bir JSON dize oluşturmak zorunda. Bundan kaçınmalı ve ardından AJAX çağrısı kullanılarak gönderilmelidir. Herhangi biri JavaScript ile dizeden kaçmanın bir yolunu önerebilir. Ben jQuery kullanmıyorum.
Yanıtlar:
JSON'unuzu alın ve .stringify()
alın. Ardından kullanmak .replace()
yöntem ve tüm tekrarlarını değiştirmek \n
ile\\n
.
DÜZENLE:
Bildiğim kadarıyla, bir dizedeki tüm özel karakterlerden kaçmak için iyi bilinen JS kütüphaneleri yoktur. Ancak, .replace()
yöntemi zincirleyebilir ve bunun gibi tüm özel karakterleri değiştirebilirsiniz:
var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.replace(/\\n/g, "\\n")
.replace(/\\'/g, "\\'")
.replace(/\\"/g, '\\"')
.replace(/\\&/g, "\\&")
.replace(/\\r/g, "\\r")
.replace(/\\t/g, "\\t")
.replace(/\\b/g, "\\b")
.replace(/\\f/g, "\\f");
// myEscapedJSONString is now ready to be POST'ed to the server.
Ama bu çok kötü, değil mi? Kodları parçalara ayırmanıza ve komut dosyanızın ana akışını temiz ve 8 zincirleme .replace()
çağrıdan uzak tutmanıza izin vermeleri için işlevlerin güzelliğini girin . Öyleyse bu işlevselliği escapeSpecialChars()
,. Let Devam edelim ve ekleyin prototype chain
ait String
nesne, bu yüzden çağırabilirescapeSpecialChars()
dize nesneleri doğrudan.
Şöyle ki:
String.prototype.escapeSpecialChars = function() {
return this.replace(/\\n/g, "\\n")
.replace(/\\'/g, "\\'")
.replace(/\\"/g, '\\"')
.replace(/\\&/g, "\\&")
.replace(/\\r/g, "\\r")
.replace(/\\t/g, "\\t")
.replace(/\\b/g, "\\b")
.replace(/\\f/g, "\\f");
};
Bu işlevi tanımladıktan sonra, kodumuzun ana gövdesi şu kadar basittir:
var myJSONString = JSON.stringify(myJSON);
var myEscapedJSONString = myJSONString.escapeSpecialChars();
// myEscapedJSONString is now ready to be POST'ed to the server
Kullanıcıya göre667073, önce ters eğik çizgi değiştirmeyi yeniden sıralamak ve teklif değişimini düzeltmek hariç
escape = function (str) {
return str
.replace(/[\\]/g, '\\\\')
.replace(/[\"]/g, '\\\"')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t');
};
Line separator
\u2028
ve Paragraph separator
\u2029
. Referans: es5.github.io/#x7.3
Uncaught SyntaxError: Unexpected token \ in JSON at position 2
Senin gibi ben de JSON benim içinde html nesnesi içeren özel kaçış karakterleri değiştirmek için birkaç yorum ve yazı bakıyordum.
Amacım JSON nesnesindeki özel karakterleri kaldırmak ve ayrıca json nesnesinin içindeki html'yi oluşturmaktır.
İşte yaptığım ve umarım kullanımı çok basit.
Önce JSON.stringify benim json nesne yaptı ve sonucu JSON.parse.
Örneğin:
JSON.parse(JSON.stringify(jsonObject));
Ve sorunumu çözdü ve Pure Javascript kullanarak yapıldı.
stackoverflow
hata ile karmaşık ve büyük nesneler üzerinde kırmak olacak
JSON.parse(JSON.stringify($("body")))
gövde ve birkaç tablo içeren bir html dosyasında deneyin . $ ("body") bir javascript nesnesidir ancak stringify nesneyi ayrıştırmakta başarısız olur.
Alex'in verdiği cevabın, hafifçe söylemek gerekirse, oldukça yanlış olduğunu söylemekten korkuyorum:
Bu işlev
escape = function (str) {
// TODO: escape %x75 4HEXDIG ?? chars
return str
.replace(/[\"]/g, '\\"')
.replace(/[\\]/g, '\\\\')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t')
; };
daha iyi bir yaklaşım gibi görünüyor.
Tek tırnak işaretleri için küçük bir güncelleme
function escape (key, val) {
if (typeof(val)!="string") return val;
return val
.replace(/[\\]/g, '\\\\')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t')
.replace(/[\"]/g, '\\"')
.replace(/\\'/g, "\\'");
}
var myJSONString = JSON.stringify(myJSON,escape);
bu eski bir gönderi. ancak yine de angular.fromJson ve JSON.stringify kullanan kişiler için yararlı olabilir. escape () kullanımdan kaldırıldı. bunun yerine bunu kullanın,
var uri_enc = encodeURIComponent(uri); //before you post the contents
var uri_dec = decodeURIComponent(uri_enc); //before you display/use the contents.
ref http://www.w3schools.com/jsref/jsref_decodeuricomponent.asp
JSON.stringify üzerinde ikinci bir parametre daha vardır. Yani, daha zarif bir çözüm:
function escape (key, val) {
if (typeof(val)!="string") return val;
return val
.replace(/[\"]/g, '\\"')
.replace(/[\\]/g, '\\\\')
.replace(/[\/]/g, '\\/')
.replace(/[\b]/g, '\\b')
.replace(/[\f]/g, '\\f')
.replace(/[\n]/g, '\\n')
.replace(/[\r]/g, '\\r')
.replace(/[\t]/g, '\\t')
;
}
var myJSONString = JSON.stringify(myJSON,escape);
Bu eski bir sorudur, ancak çözüm tüm vakaları çözmediği için benim için iyi çalışmadı. Sonunda burada işi yapan bir cevap buldum
Ben kaçış ve kodlama uri bileşeni kullanarak kombine benim çözüm göndereceğiz:
// implement JSON stringify serialization
JSON.stringify = JSON.stringify || function (obj) {
var t = typeof (obj);
if (t != "object" || obj === null) {
// simple data type
if (t == "string") obj = '"'+obj+'"';
return String(obj);
}
else {
// recurse array or object
var n, v, json = [], arr = (obj && obj.constructor == Array);
for (n in obj) {
v = obj[n]; t = typeof(v);
if (t == "string") v = '"'+v+'"';
else if (t == "object" && v !== null) v = JSON.stringify(v);
json.push((arr ? "" : '"' + n + '":') + String(v));
}
var rawString = (arr ? "[" : "{") + String(json) + (arr ? "]" : "}");
return rawString;
}
};
function escape (key, val) {
if (typeof(val)!="string") return val;
var replaced = encodeURIComponent(val);
return replaced;
}
JSON.stringifyEscaped = function(obj){
return JSON.stringify(obj,escape);
}
escape = (string) -> JSON.stringify(string)[1...-1]
Kullanmak daha iyi JSON.parse(yourUnescapedJson);
Sunucu tarafı komut dosyası diliniz PHP ise json_encode () kullanın ,
json_encode()
için yeni satırdan ve diğer beklenmedik belirteçlerden kaçar (PHP kullanmıyorsanız komut dosyası diliniz için benzer işlevi arayın)
sonra $.parseJSON()
JavaScript'inizde kullanın , bitti!
<script> windows.data_from_php = <?php echo json_encode(json_encode($arrayOrObjToJs)); ?>; var phpData = JSON.parse(windows.data_from_php); </script>
JSON.parse çift kodlamak php
Ajax çağrılarımda da aynı durum var, burada JSON
Textarea alanındaki satırsonu nedeniyle hata veriyordu. Burada verilen çözüm benim için işe yaramadı. Bu yüzden Javascript'in .escape
işlevini kullandım ve iyi çalıştı. Sonra değeri almak için JSON
, ben sadece kullanarak kaçtı .unescape
.
Ben giriş urlencode için bir textarea değerini ayıklamak için yerleşik jQuery.serialize () kullanılır . Pro kısmı, her özel karakterin yerine kendi başınıza aramak zorunda kalmamanız ve ayrıca satırsonlarını ve html'den kaçmayı sürdürmektir. Serileştirmenin çalışması için, giriş alanının bir ad özelliğine sahip olması gerekir ve ayrıca kaçması gereken kaçan dizeye aynı özelliği ekler. Aradığın şey olmayabilir ama benim için işe yarıyor.
var myinputfield = jQuery("#myinputfield");
var text = myinputfield.serialize();
text = text.replace(myinputfield.attr('name') + '=','');
Herhangi bir Ajax biçimi kullanılırken, CGI sunucusundan alınan yanıtların biçimi hakkında ayrıntılı belgeler Web'de eksik görünüyor. Buradaki bazı girişler, jQuery tarafından otomatik olarak veya Javascript sistemi veya kitaplık JSON ayrıştırması kullanılarak manuel olarak yapılan JSON dönüşümünde (muhtemelen yakalanmamış bir istisna atılarak oluşturulmuş) sonsuz döngülerin (askıda kalmanın) önlenmesi için döndürülen metin veya json verilerindeki yeni satırların kaçması gerektiğine işaret ediyor çağırır.
Programcıların bu sorunu yaşadıkları her durumda, yetersiz çözümler sunulur (çoğunlukla gönderen tarafta \ n yerine \ n yerine geçer) ve konu düşer. Windows yol adları gibi kontrol çıkış dizilerini yanlışlıkla gömen dize değerleri iletilirken yetersizlikleri ortaya çıkar. Bir örnek, "c: \ Chris \ Roberts.php" olup, ^ c ve ^ r kontrol karakterlerini içerir ve {"file": "C: \ Chris \ Roberts.php"} dizesinin JSON dönüştürmesine neden olabilir. sonsuza kadar döngü. Bu tür değerleri oluşturmanın bir yolu, PHP uyarı ve hata mesajlarını sunucudan istemciye geçirmeye çalışmaktır, bu da makul bir fikirdir.
Tanımı gereği Ajax, perde arkasında HTTP bağlantıları kullanır. Bu tür bağlantılar, her ikisi de kontrol karakterleri de dahil olmak üzere yanlış sözdizimini önlemek için gönderilen verilerin kodlanmasını gerektiren GET ve POST kullanarak veri iletir.
Bu, bir çözüm gibi görünen şeyi oluşturmak için yeterli ipucu verir (daha fazla teste ihtiyaç duyar): verileri kodlamak için PHP (gönderen) tarafında rawurlencode kullanmak ve verileri çözmek için Javascript (alıcı) tarafında unescape kullanmak. Bazı durumlarda, bunları metin dizelerinin tümüne uygulayacaksınız, diğer durumlarda bunları yalnızca JSON içindeki değerlere uygulayacaksınız.
Bu fikir doğru çıkarsa, her seviyedeki programcıların bu sorunu bir kez ve herkes için çözmelerine yardımcı olacak basit örnekler oluşturulabilir.
Bu gerçekten eski bir yazı gibi görünüyor :-) Ama çocuklar, bunun için en iyi geçici çözüm, karmaşık kod olmadan çalışır% 100 olmak, base64 kodlama / kod çözme her iki işlevini kullanmaktır. Bunlar atob () ve btoa (). En kolay ve en iyi yol, kaçmak için herhangi bir karakteri kaçırdıysanız endişelenmenize gerek yok.
George
Google'larınız sizi buraya indirmeye devam ederse ve JSON çift tırnaklarınız kaçmazsa (api'niz hata atarsa "{\"foo\": true}"
), tek yapmanız gereken iki kez dizgi oluşturmaktır.JSON.stringify(JSON.stringify(bar))
Dizeyi kodlamak için encodeURIComponent () öğesini kullanın.
Örneğin. var myEscapedJSONString = encodeURIComponent (JSON.stringify (myJSON));
Web sunucusu otomatik olarak aynı şeyi yaptığından kodu çözmenize gerek yoktur.
Asla düzenli ifadeler kullanmayın (yani hiç olmadığı gibi). En iyi ve etkili yol:
String.prototype.escapeJSON = function() {
var result = "";
for (var i = 0; i < this.length; i++)
{
var ch = this[i];
switch (ch)
{
case "\\": ch = "\\\\"; break;
case "\'": ch = "\\'"; break;
case "\"": ch = '\\"'; break;
case "\&": ch = "\\&"; break;
case "\t": ch = "\\t"; break;
case "\n": ch = "\\n"; break;
case "\r": ch = "\\r"; break;
case "\b": ch = "\\b"; break;
case "\f": ch = "\\f"; break;
case "\v": ch = "\\v"; break;
default: break;
}
result += ch;
}
return result;
};