Bagaimana saya bisa mengkonversi string yang menggambarkan objek menjadi string JSON menggunakan JavaScript (atau jQuery)?
mis: Konversi ini ( BUKAN string JSON yang valid):
var str = "{ hello: 'world', places: ['Africa', 'America', 'Asia', 'Australia'] }"
dalam hal ini:
str = '{ "hello": "world", "places": ["Africa", "America", "Asia", "Australia"] }'
Saya ingin menghindari penggunaan eval()
jika memungkinkan.
javascript
json
object
Snorpey
sumber
sumber
data
-attrubute, seperti ini:<div data-object="{hello:'world'}"></div>
dan saya tidak ingin menggunakan tanda kutip tunggal dalam HTML (jadi mungkin tidak dapat dipercaya)<div data-object='{"hello":"world"}'></div>
apakah HTML yang valid 100% (apa hubungannya dengan tanda kutip dengan percaya atau tidak?). Jika Anda melakukannya dengan cara ini, Anda bisaJSON.parse
melakukannya dan itu akan berfungsi dengan baik. Catatan: kunci juga perlu dikutip.<div data-object="{\"hello\":\"world\"}"></div>
. Jika Anda tidak ingin menggunakan JSON yang valid dalam atribut, maka Anda harus membuat format sendiri dan menguraikannya sendiri.Jawaban:
Jika string adalah dari sumber yang terpercaya , Anda bisa menggunakan
eval
kemudianJSON.stringify
hasilnya. Seperti ini:Perhatikan bahwa ketika Anda
eval
sebuah objek literal, itu harus dibungkus dengan tanda kurung, jika tidak, kawat gigi diurai sebagai blok, bukan objek.Saya juga setuju dengan komentar di bawah pertanyaan bahwa akan jauh lebih baik untuk hanya menyandikan objek di JSON yang valid untuk memulai dan menghindari harus menguraikan, menyandikan, kemudian mungkin menguraikannya lagi . HTML mendukung atribut yang dikutip tunggal (pastikan untuk menyandikan HTML setiap tanda kutip tunggal di dalam string).
sumber
eval
konversikan string ke objek JavaScript (yang berfungsi, selama string tersebut merepresentasikan JavaScript yang valid, walaupun itu bukan JSON yang valid). KemudianJSON.stringify
mengonversi dari objek kembali ke string JSON (valid). Memanggileval
berbahaya jika string bukan dari sumber tepercaya karena itu benar-benar dapat menjalankan JavaScript yang membuka kemungkinan serangan skrip lintas situs.String Anda bukan JSON yang valid, jadi
JSON.parse
(atau jQuery$.parseJSON
) tidak akan berfungsi.Salah satu caranya adalah dengan menggunakan
eval
"parse" JSON "tidak valid", dan kemudianstringify
"mengubahnya" menjadi JSON yang valid.Saya sarankan daripada mencoba untuk "memperbaiki" JSON Anda yang tidak valid, Anda mulai dengan JSON yang valid di tempat pertama. Bagaimana
str
cara dihasilkan, itu harus diperbaiki di sana, sebelum itu dihasilkan, bukan setelah.EDIT : Anda bilang (dalam komentar) string ini disimpan dalam atribut data:
Saya sarankan Anda memperbaikinya di sini, jadi bisa saja
JSON.parse
d. Pertama, baik kunci dan nilainya perlu dikutip dalam tanda kutip ganda. Seharusnya terlihat (atribut tunggal yang dikutip dalam HTML valid):Sekarang, Anda bisa menggunakan
JSON.parse
(atau jQuery$.parseJSON
).sumber
jQuery.parseJSON
Edit. Ini asalkan Anda memiliki string JSON yang valid
sumber
Gunakan kode sederhana di tautan di bawah ini:
http://msdn.microsoft.com/es-es/library/ie/cc836466%28v=vs.94%29.aspx
dan mundur
sumber
Saya harap fungsi kecil ini mengubah string JSON yang tidak valid menjadi string yang valid.
Hasil
sumber
:
berada di salah satu nilai.Gunakan dengan hati-hati (karena
eval()
):panggil sebagai:
sumber
eval()
adalah satu-satunya cara untuk melakukannya. b) Saya memperingatkan OP tentang hal itu. c) Lihatlah jawaban Matius Crumley dan pikirkan penjelasan yang lebih baik. (Oh, dan d) pernyataaneval()
itu buruk tidak masuk akal dalam bentuk umum ini.)eval("var x = " + str + ";")
JS yang benar-benar valid. Anda tidak perlu melakukannyavar x = ({a:12})
.json2.js
. Jangan jadi pemicu-senang.Penafian: jangan coba ini di rumah, atau untuk apa pun yang mengharuskan pengembang lain menganggap Anda serius:
Di sana, saya melakukannya.
Cobalah untuk tidak melakukannya, eval itu BURUK untuk Anda. Seperti diceritakan di atas, gunakan JSON shim Crockford untuk peramban yang lebih lama (IE7 dan di bawah)
Metode ini mengharuskan string Anda menjadi javascript yang valid , yang akan dikonversi ke objek javascript yang kemudian dapat diserialisasi ke JSON.
sunting: diperbaiki seperti yang disarankan Rocket.
sumber
JSON.stringify(eval('('+str+')'));
, bukan saya memaafkaneval
, tetapi string-nya JSON tidak valid sehinggaJSON.parse
tidak berfungsi.Saya memberikan jawaban saya untuk seseorang yang tertarik pada utas lama ini.
Saya membuat parser data HTML5 * untuk plugin dan demo jQuery yang mengubah string JSON yang rusak menjadi objek JavaScript tanpa menggunakan
eval()
.Itu dapat melewatkan atribut data HTML5- * di bawah:
ke dalam objek:
sumber
Douglas Crockford memiliki konverter, tetapi saya tidak yakin ini akan membantu dengan JSON yang buruk menjadi JSON yang baik.
https://github.com/douglascrockford/JSON-js
sumber
Ada cara yang lebih sederhana untuk mencapai prestasi ini, cukup bajak atribut onclick elemen dummy untuk memaksa pengembalian string Anda sebagai objek JavaScript:
Berikut ini demo: http://codepen.io/csuwldcat/pen/dfzsu (buka konsol Anda)
sumber
Anda perlu menggunakan "eval" lalu JSON.stringify lalu JSON.parse ke hasilnya.
sumber
Anda harus menulis kurung bundar, karena tanpa mereka
eval
akan menganggap kode di dalam kurung keriting sebagai blok perintah.sumber
Taruhan terbaik dan teraman Anda adalah JSON5 - JSON untuk Manusia . Itu dibuat khusus untuk use case itu.
sumber
Menggunakan Function baru () lebih baik daripada eval, tetapi masih harus digunakan dengan input yang aman.
Sumber: MDN , 2ality
sumber
Untuk contoh sederhana Anda di atas, Anda dapat melakukan ini menggunakan 2 pengganti regex sederhana:
Peringatan besar : Pendekatan naif ini mengasumsikan bahwa objek tidak memiliki string yang mengandung karakter
'
atau:
. Sebagai contoh, saya tidak bisa memikirkan cara yang baik untuk mengubah objek-string berikut ke JSON tanpa menggunakaneval
:sumber
Hanya untuk kebiasaannya, Anda dapat mengonversi string Anda melalui
babel-standalone
sumber
var str = "{halo: 'dunia', tempat: ['Afrika', 'Amerika', 'Asia', 'Australia']}" var fStr = str .replace (/ ([Az] *) (:) / g, '"$ 1":') .replace (/ '/ g, "\" ")
console.log (JSON.parse (fStr))
Maaf saya di ponsel saya, ini foto.
sumber
Solusi dengan satu regex dan tidak menggunakan eval:
Ini saya percaya harus bekerja untuk beberapa baris dan semua kemungkinan kemunculan (/ g flag) dari tanda kutip tunggal 'string' diganti dengan tanda kutip ganda "string".
sumber
sumber
Mungkin Anda harus mencoba ini:
sumber