JSON çift tırnak kaçmak için nasıl


306

Ben çift tırnak göstermeye çalışıyorum ama ters eğik çizgiler birini gösterir:

"maingame": {
    "day1": {
        "text1": "Tag 1",
        "text2": "Heute startet unsere Rundreise \\\"Example text\\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
    }
}

Html'de oluşturma yaparken olarak gösterilir \"Example text\". Doğru yol nedir?

Yanıtlar:


446

Bunu dene:

"maingame": {
  "day1": {
    "text1": "Tag 1",
     "text2": "Heute startet unsere Rundreise \" Example text\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.</strong> "
  }
}

( \tırnak işaretleri arasında yalnızca bir ters eğik çizgi ( ) vardır).


9
@DWGuru bu yorumlarla ilgisi yoktur, en anlatıldığı gibi bir kaçış dizisi var ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (. Par 9 - Strings) şöyle der: All characters may be placed within the quotation marks except for the characters that must be escapedve sonra belirtir:\" represents the quotation mark character (U+0022)
mastazi 30:30 '

Nedense, bu JS JSON.parse () ile çalışmaz.
SacWebDeveloper

32

\\\"Bunun yerine ne zaman ve nerede kullanılır . Eğer benim gibi iseniz Tamam bu iş parçacığı buldum sonra ne yaptığımı fark ettiğimde yaptığım gibi aptal hissedeceksiniz.

Bir .json metin dosyası / akışı oluşturuyorsanız ve verileri buradan içe aktarıyorsanız, çift tırnak işaretinden önce yalnızca bir ters eğik çizginin ana akış yanıtı: \"aradığınız kişidir.

Ancak benim gibi ve w3schools.com "Tryit Editor" JSON.parse (metin) çıkışında çift tırnak almak için çalışıyorsanız, o zaman aradığınız üçlü ters eğik çizgi çift tırnak \\\". Bunun nedeni, metin dizenizi bir HTML <script>bloğu içinde oluşturduğunuz ve ilk çift ters eğik çizgi, dize değişkenine tek bir ters eğik çizgi ekledikten sonra, aşağıdaki ters eğik çizgi çift alıntısı, çiftli alıntıyı dizeye içine ekler \". standart yanıt ve JSON ayrıştırıcısı bunu yalnızca çift tırnak olarak ayrıştırır.

<script>
  var text="{";
  text += '"quip":"\\\"If nobody is listening, then you\'re likely talking to the wrong audience.\\\""';
  text += "}";
  var obj=JSON.parse(text);
</script>

+1: bir JavaScript metin dizesi olduğundan, çift ters eğik çizgi çift tırnak \\"da işe yarayacaktır; çünkü çift tırnak tek tırnaklı bir dize içinde kaçmaya ihtiyaç duymaz, örneğin aynı JS dizesi '\"'ile '"'sonuçlanır.


Bu çözüm, bir JSON POST için bağımsız değişkenlere eklenen bir dize oluşturan Swift sürümünde yardımcı olur.
Nick N

18

Ters eğik çizgiyi gösteriyor çünkü ters eğik çizgiden de kaçıyorsunuz.

Çift tırnak işaretlerinin yanı sıra, JSON tarafından verilen dizeye bir tane eklemek istiyorsanız ters eğik çizgilerden kaçmanız gerekir. Ancak kaçış sırasında ters eğik çizgi kullanmayı düşünüyorsanız, kesinlikle kaçmamalısınız.


9

Bunun çoğunlukla içerik "çift kodlanmış" olduğunda, yani kodlama algoritmasının yanlışlıkla iki kez çağrıldığı zaman gerçekleştiğini unutmayın.

İlk çağrı "text2" değerini kodlar:

BAŞLANGIÇ: Heute startet unere Rundreise "Örnek metin". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

YAPıLıR: Heute startet unsere Rundreise \ "Örnek metin \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Daha sonra ikinci bir kodlama, daha önce kaçmış karakterlerden kaçarak tekrar dönüştürür:

FROM: Heute startet unsere Rundreise \ "Örnek metin \". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

YAPıLıR: Heute startet unsere Rundreise \\\ "Örnek metin \\\". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.

Bu nedenle, sunucunun burada uygulanmasından sorumluysanız, aynı içeriği kodlamaya çalışan iki adım olmadığından emin olun.


6
Senin ikinci düşünüyorum böylece kodlayıcı da kaçış anahtarını kaçmak inanıyoruz : TO şöyle olmalıdır: "Heute başlatabilirisiniz unsere Rundreise \\\" Örnek metni \\\" Jeden Tag wird ein neues Reiseziel angesteuert bis wir..
Jonathan Mee

1
@Jonathan Mee: Cevabını önerinize göre düzenledi. Teorik olarak 3 ters eğik çizgi ile doğru yazılmıştır, ancak stackoverflow ayrıca alıntı için ters eğik çizgi kullanır ve ilk iki ters eğik
çizgiyi

5

JSON çift tırnak kaçmak istiyorsanız kaçmak için \\ kullanın.

aşağıdaki javascript nesnesinin json'unu oluşturmak istiyorsanız

{time: '7 "o" clock'}

o zaman aşağıdaki şekilde yazmalısın

'{"time":"7 \\"o\\" clock"}'

kullanarak ayrıştırırsak JSON.parse()

JSON.parse('{"time":"7 \\"o\\" clock"}')

sonuç olacak

{time: "7 "o" clock"}

1

JSON verileri için sorunlara neden olan ters eğik çizgilerden kaçmak için bu işlevi kullanıyorum.

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};

6
İçeriği kaldırmak (veya "temizlemek") yerine programcıları içeriği kodlamaya teşvik ederim. Eskiden veritabanı verilerini "temizleme" fikri vardı - özellikle tek tırnak işaretlerini (') kaldırmak. Programcılar insanların kendi soyadlarını (O'Doul) kullanamayacağını fark etmediler. Umarım bugünün programcıları, verileri çıkarmadan veya temizlemeden orijinal içeriği veritabanına almak için başka araçlar kullanırlar.
DanBaker

Tamam, kitleleri yatıştırmak için sıyırma karakterini çıkardım. @DanBaker, bir istemci uygulamasında JS'yi güvenli hale getirmenin tek yolu olabilir. Açısal, varsayılan olarak HTML çıktısını bu nedenle temizler.
mbokil

Katılıyorum% 100 verilerin sterilize edilmesi gereken zamanlar var ... ve XSS o zamanlardan biri. Bunu gösterdiğin için teşekkürler.
DanBaker

0

Geliştirici powershell kullanmak isteyenler için. Ayarlarınıza eklenecek satırlar şunlardır: json:

"terminal.integrated.automationShell.windows": "C:\\Windows\\SysWOW64\\WindowsPowerShell\\v1.0\\powershell.exe",
"terminal.integrated.shellArgs.windows": [
    "-noe",
    "-c",
    " &{Import-Module 'C:\\Program Files (x86)\\Microsoft Visual Studio\\2019\\BuildTools\\Common7\\Tools\\Microsoft.VisualStudio.DevShell.dll'; Enter-VsDevShell b7c50c8d} ",
    ],
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.