it-swarm.asia

Bagaimana cara menghindari karakter khusus dalam membangun string JSON?

Ini senar saya 

{
    'user': {
        'name': 'abc',
        'fx': {
            'message': {
                'color': 'red'
            },
            'user': {
                'color': 'blue'
            }
        }
    },
    'timestamp': '2013-10-04T08: 10: 41+0100',
    'message': 'I'mABC..',
    'nanotime': '19993363098581330'
}    

Di sini pesan berisi tanda kutip tunggal, yang sama dengan kutipan yang digunakan dalam JSON. Apa yang saya lakukan adalah mengisi string dari input pengguna seperti pesan. Jadi, saya perlu melarikan diri dari skenario khusus yang memecahkan kode. Tapi selain ganti string, apakah ada cara untuk membuat mereka keluar tetapi masih memungkinkan HTML untuk memprosesnya kembali ke pesan yang benar?

157
dinesh707

String JSON harus dikutip ganda, sesuai dengan spesifikasi , sehingga Anda tidak perlu keluar dari '.
Jika Anda harus menggunakan karakter khusus dalam string JSON Anda, Anda dapat menghindarinya menggunakan karakter \.

Lihat daftar karakter khusus ini yang digunakan dalam JSON:

\b  Backspace (ascii code 08)
\f  Form feed (ascii code 0C)
\n  New line
\r  Carriage return
\t  Tab
\"  Double quote
\\  Backslash character


Namun, bahkan jika itu benar-benar bertentangan dengan spec, penulis dapat menggunakan \'.

Ini buruk karena:

  • Itu IS bertentangan dengan spesifikasi
  • Ini bukan lagi string yang valid JSON

Tapi itu berfungsi, seperti yang Anda inginkan atau tidak.

Untuk pembaca baru, selalu gunakan tanda kutip ganda untuk string json Anda.

237
AlexB

Saya terkejut dengan adanya informasi yang salah tentang topik yang sangat banyak dilihat tentang topik dasar.

String JSON tidak dapat dikutip dengan tanda kutip tunggal. Berbagai versi spesifikasi ( asli oleh Douglas Crockford, versi ECMA , dan versi IETF ) semua menyatakan bahwa string harus dikutip dengan tanda kutip ganda. Ini bukan masalah teoritis, atau masalah pendapat seperti yang diterima oleh jawaban saat ini; setiap parser JSON di dunia nyata akan kesalahan jika Anda mencoba untuk menguraikan string yang dikutip tunggal.

Versi Crockford dan ECMA bahkan menampilkan definisi string menggunakan gambar yang cantik, yang seharusnya membuat titik jelas jelas:

Image showing the definition of a string from the JSON spec

Gambar cantik juga mencantumkan semua urutan pelarian yang sah dalam string JSON:

  • \"
  • \\
  • \/
  • \b
  • \f
  • \n
  • \r
  • \t
  • \u diikuti oleh empat-hex-digit

Perhatikan bahwa, berbeda dengan omong kosong dalam beberapa jawaban lain di sini, \' tidak pernah merupakan urutan pelarian yang valid dalam string JSON. Tidak harus demikian, karena string JSON selalu dikutip ganda.

Akhirnya, Anda seharusnya tidak perlu memikirkan untuk melarikan diri karakter sendiri ketika secara terprogram menghasilkan JSON (meskipun tentu saja Anda akan ketika mengedit secara manual, katakanlah, file konfigurasi berbasis JSON). Alih-alih, bentuk struktur data yang ingin Anda enkode menggunakan jenis peta, larik, string, nomor, boolean, dan null apa pun yang dimiliki bahasa Anda, dan kemudian menyandikannya ke JSON dengan fungsi penyandian JSON. Fungsi seperti itu mungkin dibangun ke dalam bahasa apa pun yang Anda gunakan, seperti JavaScript JSON.stringify , PHP's json_encode , atau Python json.dumps . Jika Anda menggunakan bahasa yang tidak memiliki fungsi seperti itu, Anda mungkin dapat menemukan parsing dan pengkodean JSON untuk digunakan. Jika Anda hanya menggunakan bahasa atau fungsi perpustakaan untuk mengonversi berbagai hal ke dan dari JSON, Anda bahkan tidak perlu tahu aturan pelarian JSON. Inilah yang seharusnya dilakukan oleh penanya yang salah arah.

299
Mark Amery

Semua orang berbicara tentang cara melepaskan ' dalam string literal '- yang dikutip. Ada masalah yang jauh lebih besar di sini: string liter yang dikutip tunggal bukan JSON yang valid . JSON didasarkan pada JavaScript, tetapi ini bukan hal yang sama. Jika Anda menulis objek literal di dalam kode JavaScript, baik; jika Anda benar-benar membutuhkan JSON, Anda perlu menggunakan ".

Dengan string yang dikutip ganda, Anda tidak perlu keluar dari '. (Dan jika Anda ingin " literal dalam string, Anda akan menggunakan \".)

25
David Knipe

Sebagian besar jawaban ini tidak menjawab pertanyaan atau tidak perlu lama dalam penjelasan.

OK jadi JSON hanya menggunakan tanda kutip ganda, kami mengerti!

Saya mencoba menggunakan JQuery AJAX untuk mengirim data JSON ke server dan kemudian mengembalikan informasi yang sama . Solusi terbaik untuk pertanyaan yang saya temukan adalah menggunakan:

var d = {
    name: 'whatever',
    address: 'whatever',
    DOB: '01/01/2001'
}
$.ajax({
    type: "POST",
    url: 'some/url',
    dataType: 'json',
    data: JSON.stringify(d),
    ...
}

Ini akan keluar dari karakter untuk Anda.

Ini juga disarankan oleh Mark Amery, Jawaban yang bagus BTW

Semoga ini bisa membantu seseorang.

7
Kickass

Mungkin saya terlambat ke pesta tetapi ini akan mengurai/melarikan diri kutipan tunggal (tidak ingin terlibat dalam pertempuran parse vs melarikan diri) ..

JSON.parse("\"'\"")
1
YankTHEcode

Saya pikir kita semua setuju jsons yang dikutip tunggal bukan jsons nyata. Bagaimanapun, kita masih perlu menjawab pertanyaan untuk melarikan diri "dalam string json yang dikutip ganda, dengan tidak adanya perpustakaan untuk melakukannya untuk kita.

Mengganti setiap "dengan \" BUKAN CUKUP: Pengguna dapat memasukkan input:\ Dan mengurai, sekali lagi, gagal (pikirkan alasannya).

Sebagai gantinya, pertama-tama ganti setiap\dengan\(double backslash) . Hanya kemudian, ganti masing-masing "dengan \" (backslash diikuti oleh ").

0
Tom Blitz

Jawab pertanyaan langsung:
.__ Agar aman, ganti karakter yang diperlukan dengan\u + 4-digit-hex-value

Contoh: Jika Anda ingin lepas dari tanda kutip 'ganti dengan\u0027
D'Amico menjadi D\u0027Amico

REFERENSI Bagus: http://es5.github.io/x7.html#x7.8.4

https://mathiasbynens.be/notes/javascript-escapes

0
Luigi D'Amico

Gunakan encodeURIComponent () untuk menyandikan string.

Misalnya. var product_list = encodeURIComponent (JSON.stringify (product_list));

Anda tidak perlu men-decode karena server web secara otomatis melakukan hal yang sama.

0