Cả Python dict
(trước Python 3.7) và đối tượng JSON đều là các bộ sưu tập không có thứ tự. Bạn có thể truyền sort_keys
tham số, để sắp xếp các khóa:
>>> 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}'
Nếu bạn cần một đơn đặt hàng cụ thể; bạn có thể sử dụngcollections.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}'
Kể từ Python 3.6 , thứ tự đối số từ khóa được giữ nguyên và ở trên có thể được viết lại bằng cú pháp đẹp hơn:
>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'
Xem PEP 468 - Giữ nguyên thứ tự đối số từ khóa .
Nếu đầu vào của bạn được cung cấp dưới dạng JSON thì để duy trì thứ tự (để nhận OrderedDict
), bạn có thể vượt qua object_pair_hook
, như được đề xuất bởi @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)])