Bagaimana cara menghindari karakter khusus dalam membangun string JSON?

200

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?

dinesh707
sumber
45
JSON hanya menggunakan tanda kutip ganda, bukan tanda kutip tunggal, lihat json.org
Niels Bom
4
RFC 4627 menyatakan bahwa parser harus mampu mengurai JSON yang sesuai (paragraf 4), dan dapat mendukung ekstensi non-JSON tambahan. Namun, paragraf 5 dengan tegas menyatakan bahwa semua produsen (generator) HARUS menghasilkan HANYA 100% memenuhi JSON. Memproduksi JSON dengan karakter bingkai yang tidak perlu melarikan diri adalah ide yang sangat buruk. Silakan pertimbangkan mengganti apostrof Anda dengan tanda kutip. ietf.org/rfc/rfc4627.txt
Luv2code
3
@ Luv2code Sementara poin yang Anda buat tetap benar, perhatikan bahwa Anda mengutip spesifikasi yang sudah usang. Saat membaca RFC, selalu gunakan versi tools.ietf.org/html , bukan versi teks. Versi HTML lebih mudah dibaca dan ditautkan ke subbagian, dan yang paling penting, di bagian atas versi HTML adalah daftar semua RFC berikutnya yang memperbarui atau usang yang Anda baca. Jika Anda pergi ke tools.ietf.org/html/rfc4627 Anda akan melihat bahwa RFC 4627 sudah usang dan telah digantikan oleh RFC 7159 .
Mark Amery
3
Untuk orang yang membaca ini di masa depan, RFC 7159 pada gilirannya telah usang oleh tools.ietf.org/html/rfc8259
Joram van den Boezem

Jawaban:

286

String JSON harus dikutip ganda, sesuai dengan spesifikasi , jadi Anda tidak perlu melarikan diri '.
Jika Anda harus menggunakan karakter khusus di 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 spesifikasi, penulis dapat menggunakannya \'.

Ini buruk karena:

  • Ini 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.

AlexB
sumber
30
"string json dikutip tunggal" ? Ini tidak masuk akal; string dalam JSON hanya bisa dikutip ganda. Coba JSON.parse("'foo'")di konsol browser Anda, misalnya, dan amati SyntaxError: Unexpected token '. Spesifikasi JSON sangat sederhana dan jelas tentang ini. Tidak ada urutan keluar di JSON untuk tanda kutip tunggal, dan string JSON tidak dapat dikutip tunggal.
Mark Amery
15
Bahkan pembaruan yang seharusnya mengklarifikasi untuk jawaban ini adalah buruk. Meskipun secara teknis benar, menyesatkan untuk mengatakan bahwa Anda "tidak perlu" melarikan diri ', dengan cara yang sama secara teknis benar tetapi menyesatkan untuk mengatakan bahwa secara hukum Anda tidak perlu membunuh anak-anak. Yang lebih tepat adalah mengatakan bahwa Anda tidak dapat melarikan diri '. \'adalah urutan pelarian yang ilegal, dan jika Anda menggunakannya maka JSON Anda bukan JSON yang valid dan pengurai JSON mana pun akan mencekiknya. (Tentu saja JavaScript JSON.parsedan Python json.loads.)
Mark Amery
2
Jawaban ini tetap omong kosong setelah banyak pengeditan. Anda mengklaim, secara keliru, bahwa menggunakan string kutipan tunggal di JSON dan menggunakan \'urutan escape "berfungsi, seperti yang Anda inginkan atau tidak" . Ini salah. Saya menantang Anda untuk memamerkan parser JSON apa pun yang digunakan populer yang tidak akan tercekik pada string yang dikutip tunggal atau pada \'urutannya. Saya sudah menunjukkan itu JSON.parse("'foo'")dan JSON.parse('"\\\'"') (dalam JavaScript) dan json.loads("'foo'")dan json.loads('"\\\'"')(dalam Python) keduanya melempar pengecualian. Apa yang menjadi dasar Anda untuk klaim bahwa menggunakan konstruksi ini "bekerja"?
Mark Amery
10
@ Luv2code kutipan menarik. Anda salah mengartikannya sedikit; itu tidak berarti bahwa karakter apa pun dapat melarikan diri hanya dengan meletakkan garis miring terbalik di depannya. Kutipan yang lebih lengkap adalah "Setiap karakter dapat diloloskan. Jika karakter tersebut berada di Basic Multilingual Plane (U + 0000 hingga U + FFFF), maka itu dapat direpresentasikan sebagai urutan enam karakter . ... Atau, ada dua representasi karakter -kursi melarikan diri dari beberapa karakter populer. "(penekanan milikku). Itu mengatakan Anda dapat melarikan diri 'sebagai \u0027, tidak bahwa Anda dapat melarikan diri sebagai \'.
Mark Amery
2
@Luv2code masih, itu berarti bahwa komentar saya yang menyatakan bahwa "Anda tidak dapat melarikan diri '" (dan membandingkan tindakan seperti itu dengan pembunuhan anak-anak!) Secara teknis salah; lebih akurat adalah dengan mengatakan bahwa Anda dapat menghindarinya, hanya saja tidak seperti itu \'. Saya tidak menyadari bahwa versi RFC dari spec merujuk pada urutan seperti \u0027sebagai cara 'melarikan diri' karakter yang mereka wakili. Namun, poin kunci yang \'ilegal tetap benar dan penting.
Mark Amery
362

Saya terkejut dengan adanya informasi yang salah tentang topik dasar.

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

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

Gambar yang menunjukkan definisi string dari spec JSON

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

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

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

Akhirnya, Anda seharusnya tidak perlu berpikir tentang melarikan diri karakter diri sendiri ketika programatik menghasilkan JSON (meskipun tentu saja Anda akan ketika secara manual mengedit, 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 semacam itu mungkin dibangun ke dalam bahasa apa pun yang Anda gunakan, seperti JavaScript JSON.stringify, PHP json_encode, atau Pythonjson.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 fungsi bahasa atau 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.

Mark Amery
sumber
4 byte hex atau camilan ?
leetbacoon
36

Semua orang berbicara tentang cara melarikan diri 'dalam 'string literal yang dikutip. Ada masalah yang jauh lebih besar di sini: string literal yang dikutip satu kali 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 menggunakannya ".

Dengan string yang dikutip ganda, Anda tidak perlu melarikan diri '. (Dan jika Anda memang menginginkan literal "dalam string, Anda akan menggunakannya \".)

David Knipe
sumber
1
Hai, Anda berkata dengan string yang dikutip ganda, Anda tidak perlu melarikan diri '. Contoh musuh jika nilai string saya "Member's_id" : 4, apakah Anda mengatakan itu tidak perlu melarikan diri? Rupanya saya mengalami masalah di mana itu memberikan kesalahan pengkodean yang salah: UTF-8 dan sedang dibaca sebagai Member�s. File json yang dihasilkan secara manual.
Shubham
1
'dalam string JSON literal tidak boleh diloloskan. Apakah Anda menyalin-menempelnya dari suatu tempat? Mungkin itu benar-benar a \u2019, bukan apostrof. Dugaan saya: seseorang mengetiknya ke dalam MS Word, yang mengubahnya menjadi tanda kutip karena dianggapnya yang paling tahu. Secara tata bahasa, apostrof karakter ASCII tua yang baik ( ', alias \x27, yang kami sebut "kutipan tunggal" sampai sekarang) adalah yang Anda inginkan. Tapi akan lebih baik untuk memperbaiki masalah pengkodean karakter Anda, jika ada masalah serupa lainnya. Jadi pilih pengkodean karakter, dan gunakan untuk membaca dan menulis. Atau melarikan diri menggunakan \u.
David Knipe
7

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.

Tendang bokong
sumber
0

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

JSON.parse("\"'\"")
Kode YankTHE
sumber
0

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

Luigi D'Amico
sumber
-1 untuk referensi. Pertanyaannya adalah tentang JSON, tetapi referensi Anda yang ditautkan adalah tentang JavaScript, dan daftar urutan pelarian yang tidak valid dalam JavaScript \'.
Mark Amery
Terima kasih Mark - Saya benar-benar hanya ingin memberikan sudut alternatif - tergantung siapa yang datang ke sini mungkin menemukan ini berguna. Tapi saya ambil poin Anda tentang JSON & Javascript - Terima kasih telah menjadi Ninja di forum.
Luigi D'Amico
0

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.

Sanju Kaniyamattam
sumber
0

Menggunakan literal templat ...

var json = `{"1440167924916":{"id":1440167924916,"type":"text","content":"It's a test!"}}`;
Ruben
sumber
-2

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 bagi kita.

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

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

Tom Blitz
sumber
-2

Untuk mengizinkan kutipan tunggal dalam string kutipan ragu untuk tujuan json, Anda menggandakan kutipan tunggal. {"X": "Apa pertanyaannya"} ==> {"X": "Apa pertanyaannya"}

/codereview/69266/json-conversion-to-single-quotes

Urutan \ 'tidak valid.

4T2G
sumber
2
Menggandakan kutipan tunggal dalam string JSON tidak luput darinya. Ini berarti string Anda berisi dua tanda kutip tunggal, bukan satu tanda kutip.
Mark Amery
-15

tentang posting AlexB:

 \'  Apostrophe or single quote
 \"  Double quote

melarikan diri tanda kutip tunggal hanya berlaku dalam string json yang dikutip tunggal.
melarikan diri tanda kutip hanya berlaku dalam string json yang dikutip ganda

contoh:

'Bart\'s car'       -> valid
'Bart says \"Hi\"'  -> invalid
Bart
sumber
14
String yang dikutip tunggal tidak sah di JSON. JSON bukan javascript. JSON tidak mengizinkan untuk lolos dari penawaran tunggal. Lihat json.org untuk dokumen sintaks JSON yang sangat sederhana.
srm
3
downvote - karena tanda kutip tunggal jsons tidak valid!
DominikAngerer
Kutipan tunggal tidak valid di json. Tolong tunjukkan sampel yang berfungsi jika ini memungkinkan
Rohith