Kode python untuk memuat data dari beberapa file JSON yang rumit:
with open(filename, "r") as f:
data = json.loads(f.read())
(catatan: versi kode terbaik harus:
with open(filename, "r") as f:
data = json.load(f)
tetapi keduanya menunjukkan perilaku yang sama)
Untuk banyak jenis kesalahan JSON (pembatas yang hilang, kesalahan backslash dalam string, dll), ini mencetak pesan bermanfaat yang bagus yang berisi baris dan nomor kolom tempat kesalahan JSON ditemukan.
Namun, untuk jenis kesalahan JSON lainnya (termasuk klasik "menggunakan koma pada item terakhir dalam daftar", tetapi juga hal-hal lain seperti kapitalisasi benar / salah), output Python hanyalah:
Traceback (most recent call last):
File "myfile.py", line 8, in myfunction
config = json.loads(f.read())
File "c:\python27\lib\json\__init__.py", line 326, in loads
return _default_decoder.decode(s)
File "c:\python27\lib\json\decoder.py", line 360, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "c:\python27\lib\json\decoder.py", line 378, in raw_decode
raise ValueError("No JSON object could be decoded")
ValueError: No JSON object could be decoded
Untuk jenis ValueError, bagaimana Anda mendapatkan Python untuk memberi tahu Anda di mana kesalahan dalam file JSON?
json.load(f)
sebagai gantinyajson.loads(f.read())
Jawaban:
Saya telah menemukan bahwa
simplejson
modul memberikan lebih banyak kesalahan deskriptif dalam banyak kasus di manajson
modul built-in tidak jelas. Misalnya, untuk kasus koma setelah item terakhir dalam daftar:yang tidak terlalu deskriptif. Operasi yang sama dengan
simplejson
:Jauh lebih baik! Demikian juga untuk kesalahan umum lainnya seperti memanfaatkan
True
.sumber
json
perpustakaan stdlib telah diperbarui dan memberikan format pesan kesalahan baru. Saya tidak punya waktu untuk melacak rilis yang tepat sekarang.Anda tidak akan bisa mendapatkan python untuk memberi tahu Anda di mana JSON salah. Anda perlu menggunakan linter online di suatu tempat seperti ini
Ini akan menunjukkan Anda kesalahan dalam JSON yang Anda coba decode.
sumber
Anda dapat mencoba perpustakaan rson yang ditemukan di sini: http://code.google.com/p/rson/ . Saya juga menggunakan PYPI: https://pypi.python.org/pypi/rson/0.9 sehingga Anda dapat menggunakan easy_install atau pip untuk mendapatkannya.
untuk contoh yang diberikan oleh tom:
RSON dirancang untuk menjadi superset dari JSON, sehingga dapat mem-parsing file JSON. Ini juga memiliki sintaks alternatif yang banyak lebih baik bagi manusia untuk dilihat dan diedit. Saya menggunakannya sedikit untuk input file.
Adapun kapitalisasi nilai boolean: tampaknya rson membaca huruf boolean yang ditulis dengan huruf kapital sebagai string.
sumber
Saya memiliki masalah serupa dan itu karena singlequotes. Standar JSON ( http://json.org ) hanya berbicara tentang menggunakan tanda kutip ganda sehingga harus bahwa
json
perpustakaan python hanya mendukung tanda kutip ganda.sumber
Untuk versi khusus masalah ini, saya melanjutkan dan mencari deklarasi fungsi
load_json_file(path)
di dalampackaging.py
file, lalu menyelundupkan satuprint
baris ke dalamnya:Dengan cara itu akan mencetak konten file json sebelum memasukkan try-catch, dan dengan cara itu - bahkan dengan pengetahuan Python saya yang belum ada - saya dapat dengan cepat mencari tahu mengapa konfigurasi saya tidak dapat membaca file json.
(Itu karena saya telah mengatur editor teks saya untuk menulis BOM UTF-8 ... bodoh)
Hanya menyebutkan ini karena, walaupun mungkin bukan jawaban yang baik untuk masalah khusus OP, ini adalah metode yang agak cepat dalam menentukan sumber bug yang sangat menindas. Dan saya bertaruh bahwa banyak orang akan menemukan artikel ini yang mencari solusi yang lebih jelas untuk a
MalformedJsonFileError: No JSON object could be decoded when reading …
. Sehingga bisa membantu mereka.sumber
with open(fn) as f
), itu menangani penutupan file sebagai pengecualian untuk Anda. en.wikibooks.org/wiki/Python_Programming/…Bagi saya, file json saya sangat besar, ketika menggunakan common
json
di python mendapat kesalahan di atas.Setelah menginstal
simplejson
olehsudo pip install simplejson
.Dan kemudian saya memecahkannya.
sumber
Saya punya masalah serupa ini adalah kode saya:
masalahnya adalah saya lupa
file.close()
saya melakukannya dan memperbaiki masalahnya.sumber
with open(fn) as f
), itu menangani penutupan file sebagai pengecualian untuk Anda. en.wikibooks.org/wiki/Python_Programming/…Jawaban yang diterima adalah yang paling mudah untuk memperbaiki masalah. Tetapi jika Anda tidak diizinkan menginstal simplejson karena kebijakan perusahaan Anda, saya mengusulkan solusi di bawah ini untuk memperbaiki masalah khusus "menggunakan koma pada item terakhir dalam daftar" :
Buat kelas anak "JSONLintCheck" untuk mewarisi dari kelas "JSONDecoder" dan ganti metode init dari kelas "JSONDecoder" seperti di bawah ini:
sumber
Tekan saja masalah yang sama dan dalam kasus saya masalahnya terkait dengan
BOM
(tanda urutan byte) di awal file.json.tool
akan menolak untuk memproses file bahkan kosong (hanya kurung kurawal) sampai saya menghapus tanda BOM UTF.Apa yang telah saya lakukan adalah:
set nobomb
)Ini menyelesaikan masalah dengan json.tool. Semoga ini membantu!
sumber
Ketika file Anda dibuat. Alih-alih membuat file dengan konten kosong. Ubah dengan:
sumber
Anda dapat menggunakan cjson , yang mengklaim hingga 250 kali lebih cepat daripada implementasi pure-python, mengingat Anda memiliki "beberapa file JSON yang rumit" dan Anda mungkin perlu menjalankannya beberapa kali (decoder gagal dan melaporkan kesalahan pertama yang mereka lakukan) hanya bertemu).
sumber