JavaScript kullanarak yeni satır karakterleri içeren bir JSON dizesinden kaçmak için?


166

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.


1
\ N ile \\ n arasındaki yeni satır karakterinden kaçmayı denedim. İyi çalışıyor. Ama bunu tüm kaçış karakterleri için yapabileceğiniz herhangi bir JS kütüphanesi arıyorum.
Srikant

1
Neden JSON içindeki yeni satırlardan kaçmanız gerekiyor? Uygun değerler ilgili kodlama işlevini kullanmak olduğundan, bu değerler kullanıldıklarında nasıl kodu çözülür.
zzzzBov

Ben sadece küçük bir ek eğik çizgi keşfetmek için tüm bu şeylerin 5 dakika gibi zor olduğunu düşündüm şeylerin sihir gibi çalışır yapmak için ton varyasyonları ile her türlü denemeye 6 saat geçirdim ... düşündüğüm şey imkansız oldu. .omg
Muhammed Umer

1
Ajax çağrılarını Server-Side php-db-save ile kullandığınızda, dönüştürmek için php-fonksiyonu addslashes () kullanın. Bu çözüm ile sadece bir yer dönüştürmek ve javascript yerine satırlardan daha temiz var.
Marcel Ennix

Yanıtlar:


135

JSON'unuzu alın ve .stringify()alın. Ardından kullanmak .replace()yöntem ve tüm tekrarlarını değiştirmek \nile\\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 chainait Stringnesne, 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

3
Teşekkürler alex. Bunu tüm kaçış karakterleri için yapmak zorundayım değil mi? Bunu yapmak için herhangi bir JS kitaplığı var mı?
Srikant

2
Bu sorunumu çözen tam işlevdir String.prototype.escapeSpecialChars = function () {return this.replace (/ \\ / g, "\\\\"). değiştirin (/ \ n / g, "\\ n"). değiştirin (/ \ r / g, "\\ r"). değiştirin (/ \ t / g, "\\ t"). değiştirin (/ \ f / g, "\\ f"). (/ "/ g", \\\ "") değiştirin. yerine (/ '/ g ", \\\"'). değiştirin (/ \ & / g, "\\ &"); }
Srikant

10
User667073 tarafından verilen yanıtta belirtildiği gibi, bu çözümde birkaç hata vardır. Bkz. Json.org - & ve ' kaçış olmamalıdır .
Alexander Klimetschek

5
Düzenli ifadeler yanlış gibi göründüğü için bunu oylamam gerekiyordu. Kullanmaya çalıştım, ancak eğik çizgilerden birini kaldırarak normal ifadeleri düzeltmek zorunda kaldım, örneğin: / \\ n / g / \ n / g olmalıdır. Ayrıntılar için bu bağlantıda "Yazdırılamayan Karakterler" konusuna bakın - RegExp Bilgisi
b01

1
\ kendisi hakkında ne? bu da kaçmalı mı?
arash moeen

65

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');
};

3
Bunların hepsini yapmak zorunda değilsiniz. Yalnızca ters eğik çizgi, yeni satır, satır besleme ve iki tırnak. Ve eksik: Tek tırnak, Line separator \u2028ve Paragraph separator \u2029. Referans: es5.github.io/#x7.3
Ariel

1
Güzel, ama neden köşeli parantez gerekli ve değil: escape = function (str) {return str .replace (/ \\ / g, '\\\\') .replace (/ \ "/ g, '\\\ "'). değiştirin (/ \ // g,' \\ / '). değiştirin (/ \ b / g,' \\ b '). değiştirin (/ \ f / g,' \\ f '). değiştirin (/ \ n / g, '\\ n'). değiştirin (/ \ r / g, '\\ r'). değiştirin (/ \ t / g, '\\ t'); };
Johann Echavarria

3
mükemmel. kabul edilen cevap (bunun üstünde) işe yaramıyor. nodeJS kullanarak.
Yossi Shasho

Bu hatayı alıyorum:Uncaught SyntaxError: Unexpected token \ in JSON at position 2
Pathros

32

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ı.


4
Bu kesinlikle gitmenin yolu
Oz Lodriguez

1
Bu kesinlikle gitmenin yolu!
MartianE

1
Bu kesinlikle stackoverflowhata ile karmaşık ve büyük nesneler üzerinde kırmak olacak
AaA

1
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.
AaA

Sorgunuzu kontrol edip geri döneceğim.
Balasubramani M

24

Alex'in verdiği cevabın, hafifçe söylemek gerekirse, oldukça yanlış olduğunu söylemekten korkuyorum:

  • Alex'in kaçmaya çalıştığı bazı karakterler kaçmak zorunda değildir (& ve 'gibi);
  • \ b hiç geri karakter değil, bir kelime sınır eşleşmesi
  • Kaçması gereken karakterler kullanılmaz.

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.


5
aslında, çift tırnak işaretinden önce ters eğik çizgileri değiştirme sırasını değiştirmelisiniz, yoksa \\\\ "ile sonuçlanırsınız. Ayrıca alıntı satırı .replace (/ [\"] / g, '\\\ olmalıdır. "')
Ryan

10

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);

7

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


stringify zaten tüm kaçanları senin için yapıyor - merak ediyorum neden sadece bunu kullanmıyorsun? git.io/vglq7
Ben Davis

5

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);

5

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);
}

Belki daha sonra dizenin etrafındaki çift tırnakları da silebilirsiniz? escape = (string) -> JSON.stringify(string)[1...-1]
Radek


3

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!


Eğer php'den javascript'e JSON dizesi olarak veri aktarılıyorsa, bu cevabı kontrol edin - çift kaçış, JSON.parse'yi geçirmem ve json dizesini nesneye dönüştürmeme yardımcı oldu. <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
Vladimir Vukanac

2

Ajax çağrılarımda da aynı durum var, burada JSONTextarea alanındaki satırsonu nedeniyle hata veriyordu. Burada verilen çözüm benim için işe yaramadı. Bu yüzden Javascript'in .escapeişlevini kullandım ve iyi çalıştı. Sonra değeri almak için JSON, ben sadece kullanarak kaçtı .unescape.


Ajax çağrılarını kullanarak, ben php-işlevini newStr = addslashes (str) kullanmayı ve sonra db kaydedin. Bu yüzden javascript- (istemci) -side dönüştürmek zorunda değilsiniz. Bu çözüm ile eğik çizgileri dönüştürmek için sadece bir yere ihtiyacınız var. Bu çözümden çok memnunum.
Marcel Ennix

2

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') + '=','');

1

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.


0

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


Aynı çözümü bulduğumdan beri. Birisi bu çözümü açıklığa kavuşturabiliyor mu ve bazı gizli uyarılar varsa, Teşekkürler.
mahish

0

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))


-1

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.


-8

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;
};

"Hiçbir zaman düzenli ifadeler kullanma (demek istediğim gibi değil)" diyemezsin. Her araç amacına hizmet eder.
zstate

Cevabınız geçerlidir, sadece yüksek fikirli bir şekilde ifade ettiniz, bu da özellikle gençler için karışıklık yaratabilir.
zstate

@oncode düzenli ifadeleri nasıl ve ne zaman kullanılırsa kullanılsın inanılmaz yararsızdır. Sadece tanımlanmamış davranışa ve CPU zamanını boşa harcar.
Alek Depler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.