如何在Python中维护JSON转储中的字典元素顺序

use*_*184 0 python json

由于本网站上非常有帮助的人,我已经能够整合一个脚本,该脚本获取用户名(由用户输入),然后使用循环将每个用户名附加到特定的JSON结构.但是,我注意到我的JSON转储中的顺序没有得到维护.例如,这是我的循环和JSON转储的样子:

list_users = []
for user in users:
    list_users.append({"name": user,
                       "member": 123,
                       "comment": "this is a comment"})

json_user_list_encoding = json.dumps(list_users, indent=2)
Run Code Online (Sandbox Code Playgroud)

我的打印看起来像这样:

({"member": 123,
  "comment": "this is a comment"
  "name": user
  })
Run Code Online (Sandbox Code Playgroud)

我想知道当我使用JSON转储时是否可以在"list_users"中维护相同的顺序.我已经看了一下这个网站,根据我的阅读,我将不得不分配密钥以维持特定的订单.但是,我不知道如何做到这一点,因为我只有一个JSON对象.我希望这是有道理的.谢谢您的帮助.

wim*_*wim 7

如果你只是想要它们可靠/可重复地订购,但不关心订单本身,那么json转储接受一个sort_keys可以帮助的kwarg:

>>> json.dumps({'z': 3, 'b': 2, 'a': 1})
'{"a": 1, "z": 3, "b": 2}'
>>> json.dumps({'z': 3, 'b': 2, 'a': 1}, sort_keys=True)
'{"a": 1, "b": 2, "z": 3}'
Run Code Online (Sandbox Code Playgroud)

否则,将用户放在OrderedDict一个普通的dict中.

from collections import OrderedDict

list_users.append(OrderedDict([
    ("name", user),
    ("member", 123),
    ("comment", "this is a comment"),
]))
Run Code Online (Sandbox Code Playgroud)

如果您需要将它们反序列化为相同的顺序,请使用object_pairs_hook加载时.