ทั้ง Python dict
(ก่อน Python 3.7) และวัตถุ JSON เป็นคอลเล็กชันที่ไม่ได้เรียงลำดับ คุณสามารถผ่านsort_keys
พารามิเตอร์เพื่อเรียงลำดับคีย์:
>>> 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}'
หากคุณต้องการคำสั่งซื้อเฉพาะ คุณสามารถใช้collections.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}'
ตั้งแต่ Python 3.6คำสั่งอาร์กิวเมนต์ของคำหลักจะถูกเก็บรักษาไว้และสามารถเขียนใหม่ได้โดยใช้ไวยากรณ์ของ nicer:
>>> json.dumps(OrderedDict(a=1, b=2))
'{"a": 1, "b": 2}'
>>> json.dumps(OrderedDict(b=2, a=1))
'{"b": 2, "a": 1}'
ดูPEP 468 - รักษาคำที่ใช้สั่งซื้ออาร์กิวเมนต์
ถ้าป้อนข้อมูลของคุณจะได้รับเป็น JSON แล้วเพื่อรักษาคำสั่งซื้อ (จะได้รับOrderedDict
) คุณสามารถผ่านobject_pair_hook
, ตามที่แนะนำโดย @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)])