Kode saya:
import simplejson as json
s = "{'username':'dfdsfdsf'}" #1
#s = '{"username":"dfdsfdsf"}' #2
j = json.loads(s)
#1
definisi salah
#2
definisi benar
Saya mendengar bahwa dengan Python, kutipan tunggal dan ganda dapat dipertukarkan. Adakah yang bisa menjelaskan ini kepada saya?
str(dict)
, dan tidak menginginkannyaeval
. Yang sederhana.replace("'", '"')
harus melakukan triknya.json.dumps(..)
dua kali seperti di:import json; d = dict(tags=["dog", "cat", "mouse"]); print json.dumps(json.dumps(d))
yang memberikan:"{\"tags\": [\"dog\", \"cat\", \"mouse\"]}"
kamu bisa memakai
ast.literal_eval()
sumber
{ 'a' : 'this "string" really isn\'t!!!!' }
"{'link':'<a href="mylink">http://my.com</a>'}"
? Dalam hal ini, menampilkanast.literal_eval
kesalahan sintaksAnda dapat membuang JSON dengan kutipan ganda dengan:
sumber
demjson juga merupakan paket yang bagus untuk mengatasi masalah sintaks json yang buruk:
Pemakaian:
Edit:
sumber
demjson.decode
adalah alat yang hebat untuk json yang rusak - tetapi untuk tugas yang melibatkan puluhan atau ratusan ribu paket json,ast.literal_eval
jauh lebih cepat. Bukan untuk mengatakandemjson
tidak memiliki tempatnya: Saya menggunakannya sebagai cadangan jika metode yang lebih cepat gagal.Dua masalah dengan jawaban yang diberikan sejauh ini, jika, misalnya, seseorang mengalirkan JSON yang tidak standar tersebut. Karena dengan demikian seseorang mungkin harus menafsirkan string yang masuk (bukan kamus python).
Masalah 1 -
demjson
: Dengan Python 3.7. + Dan menggunakan conda saya tidak dapat menginstal demjson karena jelas tidak mendukung Python> 3.5 saat ini. Jadi saya butuh solusi dengan cara yang lebih sederhana, misalnyaast
dan / ataujson.dumps
.Masalah 2 -
ast
&json.dumps
: Jika JSON adalah kutipan tunggal dan berisi string setidaknya dalam satu nilai, yang pada gilirannya berisi tanda kutip tunggal, satu-satunya solusi sederhana namun praktis yang saya temukan adalah menerapkan keduanya:Dalam contoh berikut kami asumsikan
line
adalah objek string JSON yang masuk:Langkah 1: ubah string yang masuk menjadi kamus menggunakan
ast.literal_eval()
Langkah 2: terapkan
json.dumps
padanya untuk konversi kunci dan nilai yang dapat diandalkan, tetapi tanpa menyentuh konten nilai :json.dumps
saja tidak akan melakukan pekerjaan itu karena tidak menafsirkan JSON, tetapi hanya melihat stringnya. Serupa untukast.literal_eval()
: meskipun menafsirkan JSON (kamus) dengan benar, itu tidak mengubah apa yang kita butuhkan.sumber
Anda bisa memperbaikinya seperti itu:
sumber
Seperti yang dikatakan, JSON bukanlah sintaks Python. Anda perlu menggunakan tanda kutip ganda di JSON. Penciptanya (di-) terkenal karena menggunakan subset ketat dari sintaks yang diizinkan untuk meringankan beban kognitif programmer.
Di bawah ini bisa gagal jika salah satu string JSON itu sendiri berisi satu kutipan seperti yang ditunjukkan oleh @Jiaaro. JANGAN GUNAKAN. Kiri di sini sebagai contoh apa yang tidak berhasil.
Sangat berguna untuk mengetahui bahwa tidak ada tanda kutip tunggal dalam string JSON. Katakanlah, Anda menyalin dan menempelkannya dari konsol browser / apa pun. Kemudian, Anda tinggal mengetik
Ini mungkin rusak jika menggunakan tanda kutip tunggal juga.
sumber
{"key": "value 'with' single quotes"}
Ini benar-benar memecahkan masalah saya menggunakan fungsi eval.
sumber
Saya baru-baru ini menghadapi masalah yang sangat mirip, dan yakin solusi saya juga akan berhasil untuk Anda. Saya memiliki file teks yang berisi daftar item dalam bentuk:
Saya ingin mengurai di atas menjadi daftar python tetapi tidak tertarik pada eval () karena saya tidak bisa mempercayai inputnya. Saya mencoba pertama kali menggunakan JSON tetapi hanya menerima item yang dikutip ganda, jadi saya menulis lexer saya sendiri yang sangat sederhana untuk kasus khusus ini (cukup colokkan "stringtoparse" Anda sendiri dan Anda akan mendapatkan daftar keluaran: 'item')
Semoga bermanfaat bagi seseorang. Nikmati!
sumber
Bekerja untuk saya
sumber
Potongan kode di atas harus berfungsi.
sumber