dict
Objek Python (sebelum Python 3.7) dan JSON adalah koleksi tidak berurutan. Anda dapat melewati sort_keys
parameter, untuk mengurutkan kunci:
>>> import json
>>> json.dumps({'a': 1, 'b': 2})
'{"b": 2, "a": 1}'
>>> json.dumps({'a': 1, 'b': 2}, sort_keys=True)
'{"a": 1, "b": 2}'
Jika Anda membutuhkan pesanan tertentu; Anda bisa menggunakancollections.OrderedDict
:
>>> from collections import OrderedDict
>>> json.dumps(OrderedDict([("a", 1), ("b", 2)]))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict([("b", 2), ("a", 1)]))
'{"b": 2, "a": 1}'
Sejak Python 3.6 , urutan argumen kata kunci dipertahankan dan di atas dapat ditulis ulang menggunakan sintaks yang lebih bagus:
>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'
Lihat PEP 468 - Memelihara Urutan Argumen Kata Kunci .
Jika input Anda diberikan sebagai JSON kemudian untuk mempertahankan pesanan (untuk mendapatkan OrderedDict
), Anda bisa lulus object_pair_hook
, seperti yang disarankan oleh @Fred Yankowski :
>>> json.loads('{"a": 1, "b": 2}', object_pairs_hook=OrderedDict)
OrderedDict([('a', 1), ('b', 2)])
>>> json.loads('{"b": 2, "a": 1}', object_pairs_hook=OrderedDict)
OrderedDict([('b', 2), ('a', 1)])
OrderedDict()
, Anda dapat meneruskandict
keOrderedDict()
, Anda juga dapat mengirimkan daftar pasangan yang dipesandict()
- meskipun urutannya hilang dalam kedua kasus ini.ordereddict_literals
daricodetransformer
paket (kualitas alpha)d = json.load(f, object_pairs_hook=OrderedDict)
, nantijson.dump(d)
akan mempertahankan urutan elemen asli.Seperti yang disebutkan orang lain, mendikte yang mendasari tidak terurut. Namun ada objek OrderedDict di python. (Mereka dibangun di dalam ular sanca baru-baru ini, atau Anda dapat menggunakan ini: http://code.activestate.com/recipes/576693/ ).
Saya percaya bahwa implementasi python json yang lebih baru dengan benar menangani dibangun di OrderedDicts, tapi saya tidak yakin (dan saya tidak memiliki akses mudah untuk menguji).
Implementasi pyjons simplejson lama tidak menangani objek OrderedDict dengan baik .. dan mengonversinya menjadi dicts biasa sebelum mengeluarkannya .. tetapi Anda dapat mengatasinya dengan melakukan hal berikut:
sekarang menggunakan ini kita dapatkan:
Cukup banyak yang diinginkan.
Alternatif lain adalah mengkhususkan pembuat enkode untuk secara langsung menggunakan kelas baris Anda, dan kemudian Anda tidak akan memerlukan dict menengah atau UnorderedDict.
sumber
sort_keys
untukTrue
saat memanggiljson.dumps()
; untuk stabilitas pesanan (untuk pengujian, caching stabil atau komitmen VCS), kunci penyortiran sudah cukup.Urutan kamus tidak memiliki hubungan dengan urutan yang didefinisikan. Ini berlaku untuk semua kamus, bukan hanya kamus yang diubah menjadi JSON.
Memang, kamus itu "terbalik" sebelum mencapai
json.dumps
:sumber
hei saya tahu sudah sangat terlambat untuk jawaban ini tetapi tambahkan sort_keys dan tetapkan false untuk itu sebagai berikut:
ini bekerja untuk saya
sumber
json.dump () akan mempertahankan ordder kamus Anda. Buka file dalam editor teks dan Anda akan melihat. Itu akan mempertahankan pesanan terlepas dari apakah Anda mengirimnya suatu Pesanan atau tidak.
Tetapi json.load () akan kehilangan urutan objek yang disimpan kecuali Anda mengatakannya untuk memuat ke dalam OrderedDict (), yang dilakukan dengan parameter object_pairs_hook seperti yang diinstruksikan JFSebastian di atas.
Jika tidak maka akan kehilangan urutan karena dalam operasi biasa, itu memuat objek kamus yang disimpan ke dalam dikt reguler dan dikt reguler tidak mempertahankan oder item yang diberikan.
sumber
di JSON, seperti pada Javascript, urutan kunci objek tidak ada artinya, jadi tidak masalah urutan apa yang ditampilkan, itu adalah objek yang sama.
sumber
dict
)