Saya mendapatkan kesalahan Expecting value: line 1 column 1 (char 0)
saat mencoba men-decode JSON.
URL yang saya gunakan untuk panggilan API berfungsi dengan baik di browser, tetapi memberikan kesalahan ini ketika dilakukan melalui permintaan ikal. Berikut ini adalah kode yang saya gunakan untuk permintaan ikal.
Kesalahan terjadi pada return simplejson.loads(response_json)
response_json = self.web_fetch(url)
response_json = response_json.decode('utf-8')
return json.loads(response_json)
def web_fetch(self, url):
buffer = StringIO()
curl = pycurl.Curl()
curl.setopt(curl.URL, url)
curl.setopt(curl.TIMEOUT, self.timeout)
curl.setopt(curl.WRITEFUNCTION, buffer.write)
curl.perform()
curl.close()
response = buffer.getvalue().strip()
return response
Traceback Penuh:
Melacak kembali:
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/django/core/handlers/base.py" in get_response
111. response = callback(request, *callback_args, **callback_kwargs)
File "/Users/nab/Desktop/pricestore/pricemodels/views.py" in view_category
620. apicall=api.API().search_parts(category_id= str(categoryofpart.api_id), manufacturer = manufacturer, filter = filters, start=(catpage-1)*20, limit=20, sort_by='[["mpn","asc"]]')
File "/Users/nab/Desktop/pricestore/pricemodels/api.py" in search_parts
176. return simplejson.loads(response_json)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/__init__.py" in loads
455. return _default_decoder.decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in decode
374. obj, end = self.raw_decode(s)
File "/Users/nab/Desktop/myenv2/lib/python2.7/site-packages/simplejson/decoder.py" in raw_decode
393. return self.scan_once(s, idx=_w(s, idx).end())
Exception Type: JSONDecodeError at /pricemodels/2/dir/
Exception Value: Expecting value: line 1 column 1 (char 0)
print repr(response_json)
memberitahu Anda sedang diteruskan.loads()
?simplejson
ketika Anda bisa menggunakan stdlibjson
(yang merupakan pustaka yang samasimplejson
)?web_fetch()
Panggilan Anda gagal.pycurl
.requests
menawarkan API yang jauh lebih mudah, terutama untuk debugging apa yang sedang terjadi. Kecuali Anda secara khusus harus memiliki versisimplejson
perpustakaan yang lebih baru, tetap sajajson
, menghemat ketergantungan Anda untuk mengelola.response_json
nilai pengembalian.json()
? Maka Anda sudah memiliki data yang diterjemahkan dan tidak perlu digunakanjson.loads()
lagi.response
menerjemahkannya untukmu.Jawaban:
Untuk meringkas percakapan dalam komentar:
Tidak perlu menggunakan
simplejson
pustaka, pustaka yang sama disertakan denganjson
modul Python .Tidak perlu men-decode respons dari UTF8 ke unicode, metode
simplejson
/json
.loads()
dapat menangani data yang disandikan UTF8 secara asli.pycurl
memiliki API yang sangat kuno. Kecuali Anda memiliki persyaratan khusus untuk menggunakannya, ada pilihan yang lebih baik.requests
menawarkan API paling ramah, termasuk dukungan JSON. Jika Anda bisa, ganti panggilan Anda dengan:sumber
requests
! Jejak tampaknya menyarankanrequests
penggunaan itucomplexjson
, yang menggunakansimplejson
. Aneh.simplejson
jika tersedia; beberapa orang ingin menggunakan rilis simplejson terbaru daripada yang dibundel dengan stdlib Python.simplejson
menggunakan built-in dijson
bawah tenda, tetapi memberikan lebih banyak kesalahan deskriptif. Dalam hal ini menggunakanjson
hanya akan memberi Anda obat generikValueError: No JSON object could be decoded
.u''
). AndaJSONDecodeError
memberi tahu Anda banyak data yang berhasil diuraikan sebelum mengalami kesalahan; itu bisa karena ada data yang tidak valid pada saat itu (dokumen JSON rusak atau rusak) atau karena data terpotong.Periksa badan data tanggapan, apakah ada data aktual dan dump data tampaknya diformat dengan baik.
Dalam kebanyakan kasus
json.loads
-JSONDecodeError: Expecting value: line 1 column 1 (char 0)
kesalahan Anda disebabkan oleh:Pada akhirnya kesalahan memberitahu Anda bahwa pada posisi pertama string sudah tidak sesuai dengan JSON.
Dengan demikian, jika parsing gagal meskipun memiliki data-body yang terlihat seperti JSON pada pandangan pertama, coba ganti kutipan dari data-body:
Catatan: Kutipan dalam data harus lolos dengan benar
sumber
requests.get(url).json()
Just Works, JSON juga tidak cacat.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
secara khusus terjadi ketika string kosong diteruskan ke json decodeJSONDecodeError: Expecting value: line 1 column 1 (char 0)
juga terjadi ketika baris pertama dalam respons json tidak valid. Contoh respons dari menjalankanaz cli
perintah adalah["WARNING: The default kind for created storage account will change to 'StorageV2' from 'Storage' in the future", '{',
. Ini memberi saya kesalahan yang membawa saya ke sini. Sisa dari respons ADALAH objek json yang valid. Hanya saja baris pertama merusak segalanya.Dengan
requests
libJSONDecodeError
dapat terjadi ketika Anda memiliki kode kesalahan http seperti 404 dan mencoba untuk menguraikan respons sebagai JSON!Anda harus terlebih dahulu memeriksa 200 (OK) atau membiarkannya meningkatkan kesalahan untuk menghindari kasus ini. Saya berharap itu gagal dengan pesan kesalahan yang kurang samar.
CATATAN : seperti yang dinyatakan Martijn Pieters di server komentar dapat merespons dengan JSON jika terjadi kesalahan (tergantung pada implementasinya), jadi memeriksa
Content-Type
header lebih dapat diandalkan.sumber
Saya pikir perlu disebutkan bahwa dalam kasus-kasus di mana Anda mem-parsing isi dari file JSON itu sendiri - cek kewarasan dapat berguna untuk memastikan bahwa Anda benar-benar memohon
json.loads()
pada isi file, sebagai lawan dari path file JSON itu :Saya agak malu untuk mengakui bahwa ini kadang-kadang bisa terjadi:
sumber
json.load()
sebagai gantinya.Periksa format penyandian file Anda dan gunakan format penyandian yang sesuai saat membaca file. Itu akan menyelesaikan masalah Anda.
sumber
encoding='utf-8'
, jadi saya kira kadang-kadang Anda perlu mencoba beberapa hal.Sering kali, ini karena string yang Anda coba parsing kosong:
Anda dapat memperbaiki dengan memeriksa apakah
json_string
kosong sebelumnya:sumber
response.read()
dan kemudian kecewa ketika panggilan lain menghasilkanExpecting value: line 1
dll. Dihapus pernyataan debug dan masalah diselesaikan.Mungkin ada 0 tertanam, bahkan setelah memanggil decode (). Gunakan ganti ():
sumber
Saya benar-benar mengalami masalah ini menggunakan permintaan. Terima kasih kepada Christophe Roussy untuk penjelasannya.
Untuk debug, saya menggunakan:
Saya mendapat respons 404 kembali dari API.
sumber
response.status_code
atauprint(response.status_code)
.Saya mengalami masalah yang sama dengan permintaan (perpustakaan python). Itu adalah
accept-encoding
header.Diatur seperti ini:
'accept-encoding': 'gzip, deflate, br'
Saya hanya menghapusnya dari permintaan dan berhenti mendapatkan kesalahan.
sumber
Bagi saya, itu tidak menggunakan otentikasi dalam permintaan.
sumber
Bagi saya itu adalah server yang merespons dengan sesuatu selain 200 dan responsnya tidak diformat json. Saya akhirnya melakukan ini sebelum json parse:
sumber
Saya mengalami masalah yang sama, ketika mencetak string json dibuka dari file json, menemukan string json dimulai dengan 'ï »¿', yang dengan melakukan beberapa penelitian karena file secara default diterjemahkan dengan UTF-8, dan dengan mengubah pengodean ke utf-8-sig, tanda keluar dilucuti dan memuat json tidak masalah:
sumber
Jika Anda adalah pengguna Windows, Tweepy API dapat menghasilkan garis kosong antara objek data. Karena situasi ini, Anda bisa mendapatkan kesalahan "JSONDecodeError: Nilai yang diharapkan: baris 1 kolom 1 (char 0)". Untuk menghindari kesalahan ini, Anda dapat menghapus baris kosong.
Sebagai contoh:
Referensi: Twitter stream API memberikan JSONDecodeError ("Nilai yang diharapkan", s, err.value) dari Tidak Ada
sumber
Periksa apakah permintaan memiliki kode status 200. Jadi misalnya:
sumber
Saya menerima kesalahan seperti itu dalam respons API web berbasis Python
.text
, tetapi itu menuntun saya ke sini, jadi ini dapat membantu orang lain dengan masalah serupa (sangat sulit untuk menyaring respons dan meminta masalah dalam pencarian saat menggunakanrequests
..)Menggunakan
json.dumps()
pada requestdata
arg untuk membuat string JSON yang lolos dengan benar sebelum POSTing memperbaiki masalah untuk sayasumber