Oke, jadi saya bisa menggunakan OrderedDict di json.dump
. Artinya, OrderedDict dapat digunakan sebagai input ke JSON.
Tapi bisakah itu digunakan sebagai output? Kalau begitu bagaimana? Dalam kasus saya, saya ingin load
menjadi OrderedDict sehingga saya dapat menjaga urutan kunci dalam file.
Jika tidak, apakah ada semacam solusi?
python
json
load
ordereddictionary
c00kiemonster
sumber
sumber
json.load
untuk menggunakan OrderedDicts alih-alih Dicts dengan Python.Jawaban:
Ya kamu bisa. Dengan menentukan
object_pairs_hook
argumen ke JSONDecoder . Sebenarnya, ini adalah contoh tepat yang diberikan dalam dokumentasi.Anda dapat meneruskan parameter ini ke
json.loads
(jika Anda tidak memerlukan turunan Dekoder untuk tujuan lain) seperti:Penggunaan
json.load
dilakukan dengan cara yang sama:sumber
object_pairs_hook
, daripada "setiap pasangan akan diteruskan ke object_pairs_hook,"json.load
tidak tetap diperintahkan oleh default, tapi terlihat seperti itu hanya mencerminkan apa yang JSON sendiri tidak - yang{}
adalah unordered, tetapi[]
di json yang diperintahkan seperti yang dijelaskan di siniOrderedDict
akan digunakan untuk membangun nilai python yang dihasilkan.Versi sederhana untuk Python 2.7+
Atau untuk Python 2.4 hingga 2.6
sumber
simplejson
danordereddict
merupakan pustaka terpisah yang perlu Anda instal.loads('{}', object_pairs_hook=OrderedDict)
.Berita bagus! Sejak versi 3.6 implementasi cPython telah mempertahankan urutan penyisipan kamus ( https://mail.python.org/pipermail/python-dev/2016-September/146327.html ). Ini berarti bahwa pustaka json sekarang mempertahankan pesanan secara default. Amati perbedaan perilaku antara python 3.5 dan 3.6. Kode:
Dalam py3.5 pesanan yang dihasilkan tidak terdefinisi:
Dalam implementasi cPython python 3.6:
Berita yang benar-benar hebat adalah bahwa ini telah menjadi spesifikasi bahasa pada python 3.7 (yang bertentangan dengan detail implementasi cPython 3.6+): https://mail.python.org/pipermail/python-dev/2017-December/151283 .html
Jadi jawaban untuk pertanyaan Anda sekarang menjadi: upgrade ke python 3.6! :)
sumber
json.loads('{"2": 2, "1": 1}')
menjadi{'1': 1, '2': 2}
bagi saya.dict.__repr__
tombol sortir sementara pemesanan yang mendasarinya dipertahankan. Dengan kata lain,json.loads('{"2": 2, "1": 1}').items()
adalahdict_items([('2', 2), ('1', 1)])
bahkan jikarepr(json.loads('{"2": 2, "1": 1}'))
ini"{'1': 1, '2': 2}"
.Anda selalu bisa menulis daftar kunci selain membuang dict, dan kemudian merekonstruksi
OrderedDict
dengan mengulangi melalui daftar?sumber
OrdereDict
s.Selain membuang daftar kunci yang dipesan di samping kamus, solusi berteknologi rendah lainnya, yang memiliki keuntungan menjadi eksplisit, adalah membuang daftar pasangan kunci-nilai (dipesan)
ordered_dict.items()
; memuat itu sederhanaOrderedDict(<list of key-value pairs>)
. Ini menangani kamus yang dipesan meskipun faktanya JSON tidak memiliki konsep ini (kamus JSON tidak memiliki urutan).Memang menyenangkan untuk mengambil keuntungan dari kenyataan bahwa
json
dump OrderedDict dalam urutan yang benar. Namun, secara umum tidak perlu berat dan tidak berarti harus membaca semua kamus JSON sebagai OrderedDict (melaluiobject_pairs_hook
argumen), jadi konversi eksplisit hanya kamus yang harus dipesan masuk akal juga.sumber
Perintah muat yang biasanya digunakan akan bekerja jika Anda menentukan parameter object_pairs_hook :
sumber