Bagaimana cara menghindari tanda kutip ganda di JSON

306

Saya mencoba menampilkan tanda kutip ganda tetapi ini menunjukkan salah satu garis miring terbalik:

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

Saat merender dalam html itu ditampilkan sebagai \"Example text\". Apa cara yang benar?

pengguna1937021
sumber

Jawaban:

446

Coba ini:

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

(hanya satu garis miring terbalik ( \) di depan tanda kutip).

kamituel
sumber
9
@DWGuru ini tidak ada hubungannya dengan komentar, ini adalah urutan pelarian seperti dijelaskan di ecma-international.org/publications/files/ECMA-ST/ECMA-404.pdf (Par. 9 - Strings) di mana dikatakan: All characters may be placed within the quotation marks except for the characters that must be escapeddan kemudian menentukan:\" represents the quotation mark character (U+0022)
mastazi
Untuk beberapa alasan, ini tidak berfungsi dengan JSON.parse () di JS.
SacWebDeveloper
32

\\\"Sebaliknya, kapan dan di mana digunakan . OK jika Anda seperti saya, Anda akan merasa sama bodohnya seperti ketika saya menyadari apa yang saya lakukan setelah saya menemukan utas ini.

Jika Anda membuat file teks / streaming .json dan mengimpor data dari sana maka jawaban aliran utama hanya satu backslash sebelum tanda kutip ganda: \"adalah yang Anda cari.

Namun jika Anda seperti saya dan Anda mencoba untuk mendapatkan "Tryit Editor" w3schools.com untuk memiliki tanda kutip ganda dalam output JSON.parse (teks), maka yang Anda cari adalah triple. backslash tanda kutip ganda \\\". Ini karena Anda sedang membangun string teks Anda dalam <script>blok HTML , dan backslash ganda pertama menyisipkan backslash tunggal ke dalam variabel string kemudian kutipan ganda backslash berikut memasukkan penawaran ganda ke dalam string sehingga string skrip yang dihasilkan berisi \"dari jawaban standar dan parser JSON akan menguraikan ini hanya sebagai tanda kutip ganda.

<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: karena ini adalah string teks JavaScript, tanda kutip ganda backslash \\"akan berfungsi juga; karena kuotasi ganda tidak perlu diloloskan dalam satu string yang dikutip misalnya '\"'dan '"'menghasilkan string JS yang sama.

Gregor y
sumber
Solusi ini membantu dalam versi Swift membangun string yang ditambahkan ke argumen untuk JSON POST.
Nick N
18

Ini menunjukkan garis miring terbalik karena Anda juga lolos dari garis miring terbalik.

Selain dari tanda kutip ganda, Anda juga harus melarikan diri dari garis miring terbalik jika Anda ingin memasukkannya dalam string yang dikutip JSON. Namun jika Anda berniat menggunakan backslash dalam urutan escape, jelas Anda tidak harus menghindarinya.

Alex Worden
sumber
9

Perhatikan bahwa ini paling sering terjadi ketika konten telah "dikodekan ganda", yang berarti algoritma pengkodean secara tidak sengaja telah dipanggil dua kali.

Panggilan pertama akan menyandikan nilai "text2":

DARI: Heute startet unsere Rundreise "Contoh teks". Jeden Tag telah menambahkan Reiseziel angesteuert bis wir.

UNTUK: Heute startet unsere Rundreise \ "Contoh teks \". Jeden Tag telah menambahkan Reiseziel angesteuert bis wir.

Pengkodean kedua kemudian mengonversinya lagi, keluar dari karakter yang sudah lolos:

DARI: Heute startet unsere Rundreise \ "Contoh teks \". Jeden Tag telah menambahkan Reiseziel angesteuert bis wir.

UNTUK: Heute startet unsere Rundreise \\ "Contoh teks \\". Jeden Tag telah menambahkan Reiseziel angesteuert bis wir.

Jadi, jika Anda bertanggung jawab atas implementasi server di sini, periksa untuk memastikan tidak ada dua langkah yang mencoba menyandikan konten yang sama.

Ben
sumber
6
Saya percaya bahwa pembuat enkode juga akan lolos dari saklar pelolosan jadi saya pikir TO kedua Anda : harus membaca: "Heute startet unsere Rundreise \\" Contoh teks \\ ". Jeden Tag wird ein neues Reiseziel angesteuert bis wir.
Jonathan Mee
1
@ Jonathan Mee: Baru saja mengedit jawaban sesuai dengan saran Anda. Secara teoritis ditulis dengan benar dengan 3 garis miring terbalik, tetapi stackoverflow juga menggunakan garis miring terbalik untuk mengutip dan mengubah dua garis miring terbalik pertama menjadi satu garis miring terbalik
huha
5

jika Anda ingin menghindari kutip ganda di JSON gunakan \\ untuk menghindarinya.

contoh jika Anda ingin membuat json dari objek javascript berikut

{time: '7 "o" clock'}

maka Anda harus menulis dengan cara berikut

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

jika kita menguraikannya menggunakan JSON.parse()

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

hasilnya akan

{time: "7 "o" clock"}
manas
sumber
1

Untuk menghindari backslash yang menyebabkan masalah untuk data JSON saya menggunakan fungsi ini.

//escape backslash to avoid errors
var escapeJSON = function(str) {
    return str.replace(/\\/g,'\\');
};
mbokil
sumber
6
Saya akan mendorong programmer untuk menyandikan konten, alih-alih menghapus (atau "membersihkan") konten. Dulu ada ide "membersihkan" data database - terutama menghapus tanda kutip tunggal ('). Programmer tidak menyadari bahwa orang tidak dapat menggunakan nama belakang mereka sendiri (O'Doul). Saya harap programmer hari ini menggunakan cara lain untuk memasukkan konten asli ke dalam database tanpa membuang atau membersihkan data.
DanBaker
Ok saya menghapus bagian karakter stripping untuk menenangkan massa. @DanBaker perlu diingat bahwa pengupasan teks karakter mungkin merupakan satu-satunya cara untuk membuat JS aman di aplikasi klien. Angular membersihkan output HTML untuk alasan ini secara default.
mbokil
Saya setuju 100% ada saatnya data harus disanitasi ... dan XSS adalah salah satunya. Terima kasih telah menunjukkannya.
DanBaker
0

Bagi mereka yang ingin menggunakan PowerShell pengembang. Berikut adalah baris untuk ditambahkan ke pengaturan Anda. 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} ",
    ],
erikeah
sumber