Saya telah mencoba mencari cara yang baik untuk memuat objek JSON dengan Python. Saya mengirim data json ini:
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
ke backend di mana itu akan diterima sebagai string lalu saya menggunakannya json.loads(data)
untuk menguraikannya.
Tetapi setiap kali saya mendapat pengecualian yang sama:
ValueError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
Saya mencarinya di Google tetapi tidak ada yang berhasil selain solusi ini json.loads(json.dumps(data))
yang secara pribadi menurut saya tidak seefisien itu karena menerima semua jenis data bahkan yang tidak dalam format json.
Setiap saran akan sangat dihargai.
json.dumps()
daripada hanya menulis python dan berharap bahwa notasi python akan berfungsi di pembaca JavaScript Anda.print(jsonpickle_deserialized_object_string)
dan mencoba menggunakannya. Untuk beberapa alasanprint()
mengubah kutipan dari"
menjadi'
Jawaban:
Ini:
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
bukan JSON.
Ini:
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
adalah JSON.
EDIT:
Beberapa komentator menyarankan bahwa hal di atas tidak cukup.
Spesifikasi JSON - RFC7159 menyatakan bahwa string dimulai dan diakhiri dengan tanda kutip. Begitulah
"
.Quoute tunggal
'
tidak memiliki arti semantik di JSON dan hanya diperbolehkan di dalam string.sumber
karena JSON hanya mengizinkan string dengan tanda kutip ganda, Anda dapat memanipulasi string seperti ini:
str = str.replace("\'", "\"")
jika JSON Anda menahan tanda kutip tunggal (
\'
) yang lolos, Anda harus menggunakan kode berikut yang lebih tepat:import re p = re.compile('(?<!\\\\)\'') str = p.sub('\"', str)
Ini akan mengganti semua kemunculan tanda kutip tunggal dengan tanda kutip ganda dalam string JSON
str
dan dalam kasus terakhir tidak akan mengganti tanda kutip tunggal yang di-escape.Anda juga bisa menggunakan
js-beautify
yang tidak terlalu ketat:sumber
Dalam kasus saya, tanda kutip ganda bukanlah masalah.
Koma terakhir memberi saya pesan kesalahan yang sama.
{'a':{'b':c,}} ^
Untuk menghapus koma ini, saya menulis beberapa kode sederhana.
import json with open('a.json','r') as f: s = f.read() s = s.replace('\t','') s = s.replace('\n','') s = s.replace(',}','}') s = s.replace(',]',']') data = json.loads(s)
Dan ini berhasil untuk saya.
sumber
echo '{"json":"obj",}' | python -m json.tool
ketika dijalankan di shell, berikan "Nama properti yang diharapkan diapit tanda kutip ganda: baris 1 kolom 15 (karakter 14)". Trailing commata bukanlah JSON legal, tetapi alangkah baiknya jika modul Python JSON mengeluarkan pesan kesalahan yang relevan dalam kasus ini.Sederhananya, string itu bukan JSON yang valid. Seperti kesalahannya, dokumen JSON perlu menggunakan tanda kutip ganda.
Anda perlu memperbaiki sumber datanya.
sumber
Saya sudah memeriksa data JSON Anda
{'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}}
di http://jsonlint.com/ dan hasilnya adalah:
Error: Parse error on line 1: { 'http://example.org/ --^ Expecting 'STRING', '}', got 'undefined'
memodifikasinya menjadi string berikut memecahkan kesalahan JSON:
{ "http://example.org/about": { "http://purl.org/dc/terms/title": [{ "type": "literal", "value": "Anna's Homepage" }] } }
sumber
String JSON harus menggunakan tanda kutip ganda. Pustaka python JSON memberlakukan ini sehingga Anda tidak dapat memuat string Anda. Data Anda harus terlihat seperti ini:
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
Jika itu bukan sesuatu yang dapat Anda lakukan, Anda bisa menggunakan
ast.literal_eval()
bukannyajson.loads()
sumber
json.loads()
ast.literal_eval
akan menghasilkanValueError: malformed string
jika string JSON memiliki nilai boolean.import ast inpt = {'http://example.org/about': {'http://purl.org/dc/terms/title': [{'type': 'literal', 'value': "Anna's Homepage"}]}} json_data = ast.literal_eval(json.dumps(inpt)) print(json_data)
ini akan menyelesaikan masalah.
sumber
Seperti yang dikatakan dalam kesalahan, nama harus diapit tanda kutip ganda, bukan tanda kutip tunggal. String yang Anda berikan bukanlah JSON yang valid. Seharusnya terlihat seperti itu
{"http://example.org/about": {"http://purl.org/dc/terms/title": [{"type": "literal", "value": "Anna's Homepage"}]}}
sumber
Saya menggunakan metode ini dan berhasil mendapatkan hasil yang diinginkan. naskah saya
x = "{'inner-temperature': 31.73, 'outer-temperature': 28.38, 'keys-value': 0}" x = x.replace("'", '"') j = json.loads(x) print(j['keys-value'])
keluaran
sumber
with open('input.json','r') as f: s = f.read() s = s.replace('\'','\"') data = json.loads(s)
Ini bekerja dengan sangat baik untuk saya. Terima kasih.
sumber
x = x.replace("'", '"') j = json.loads(x)
Meskipun ini adalah solusi yang tepat, tetapi mungkin akan membuat pusing jika ada JSON seperti ini -
{'status': 'success', 'data': {'equity': {'enabled': True, 'net': 66706.14510000008, 'available': {'adhoc_margin': 0, 'cash': 1277252.56, 'opening_balance': 1277252.56, 'live_balance': 66706.14510000008, 'collateral': 249823.93, 'intraday_payin': 15000}, 'utilised': {'debits': 1475370.3449, 'exposure': 607729.3129, 'm2m_realised': 0, 'm2m_unrealised': -9033, 'option_premium': 0, 'payout': 0, 'span': 858608.032, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 249823.93}}, 'commodity': {'enabled': True, 'net': 0, 'available': {'adhoc_margin': 0, 'cash': 0, 'opening_balance': 0, 'live_balance': 0, 'collateral': 0, 'intraday_payin': 0}, 'utilised': {'debits': 0, 'exposure': 0, 'm2m_realised': 0, 'm2m_unrealised': 0, 'option_premium': 0, 'payout': 0, 'span': 0, 'holding_sales': 0, 'turnover': 0, 'liquid_collateral': 0, 'stock_collateral': 0}}}}
Memperhatikan bahwa nilai "Benar" ? Gunakan ini untuk membuat hal-hal diperiksa dua kali untuk Boolean. Ini akan mencakup kasus-kasus itu -
x = x.replace("'", '"').replace("True", '"True"').replace("False", '"False"').replace("null", '"null"') j = json.loads(x)
Juga, pastikan Anda tidak membuatnya
Itu harus menjadi variabel lain.
sumber
Saya punya masalah serupa. Dua komponen yang saling berkomunikasi menggunakan antrian.
Komponen pertama tidak melakukan json.dumps sebelum memasukkan pesan ke antrian. Jadi string JSON yang dihasilkan oleh komponen penerima berada dalam tanda kutip tunggal. Ini menyebabkan kesalahan
Expecting property name enclosed in double quotes
Menambahkan json.dumps mulai membuat JSON yang diformat dengan benar & menyelesaikan masalah.
sumber
Gunakan
eval
fungsinya.Ini menangani perbedaan antara tanda kutip tunggal dan ganda.
sumber
Seperti jawaban lain menjelaskan dengan baik kesalahan terjadi karena karakter kutipan tidak valid diteruskan ke modul json.
Dalam kasus saya, saya terus mendapatkan ValueError bahkan setelah mengganti
'
dengan"
dalam string saya. Apa yang akhirnya saya sadari adalah bahwa beberapa simbol unicode seperti kutipan telah menemukan jalannya ke string saya:Untuk membersihkan semua ini, Anda cukup meneruskan string Anda melalui ekspresi reguler:
import re raw_string = '{“key”:“value”}' parsed_string = re.sub(r"[“|”|‛|’|‘|`|´|″|′|']", '"', my_string) json_object = json.loads(parsed_string)
sumber
Saya telah mengalami masalah ini beberapa kali ketika JSON telah diedit dengan tangan. Jika seseorang menghapus sesuatu dari file tanpa menyadarinya dapat menimbulkan kesalahan yang sama.
Misalnya, Jika JSON "}" terakhir Anda tidak ada, ini akan memunculkan kesalahan yang sama.
Jadi Jika Anda mengedit file Anda dengan tangan pastikan Anda memformatnya seperti yang diharapkan oleh decoder JSON, jika tidak Anda akan mengalami masalah yang sama.
Semoga ini membantu!
sumber
Itu selalu ideal untuk menggunakan
json.dumps()
metode ini. Untuk menghilangkan kesalahan ini, saya menggunakan kode berikutjson.dumps(YOUR_DICT_STRING).replace("'", '"')
sumber