0

我有一个 json 数据,当打印出来时,它不会按照我设置的顺序打印。

#!/usr/bin/env python2.7
myjson = {
        "timestamp": "2019-05-22T15:25:15.870Z",    
        "account_name": "BLah, Inc",
    "alert_description": "Check Proc Num",
    "alert_itemid": "N/A",
    "alert_key": "N/A",
    "alert_message": "Check Proc Num",
    "alert_zabbix_url": "https://blah.com",
    "alertcount": "1",
    "alertid": "41009",
    "checkcount": "13",
    "current_state": "problem",
    "groups": ["Linux_servers--2", "blah2" ],
    "hostid": "10439",
    "hostip": "blah",
    "hostname": "blah",
    "value": "N/A"
}
myjson['account_name'] = "NewBlah, Inc"
myjson['alert_description'] = "Disk Space"

当我运行上面的代码时,我得到了这个:

{'value': 'N/A', 'hostid': '10439', 'alertid': '41009', 'alert_key': 'N/A', 'timestamp': '2019-05-22T15:25:15.870Z', 'alert_zabbix_url': 'https://blah.com', 'current_state': 'problem', 'hostname': 'blah', 'alert_message': 'Check Proc Num', 'alertcount': '1', 'groups': ['Linux_servers--2', 'blah2'], 'hostip': 'blah', 'checkcount': '13', 'alert_description': 'Disk Space', 'account_name': 'NewBlah, Inc', 'alert_itemid': 'N/A'}

问题是,这些数据都是乱序的。我希望数据看起来像这样(注意时间戳):

{ "timestamp": "2019-05-22T15:25:15.870Z", "account_name": "BLah, Inc", "alert_description": "Check Proc Num", "alert_itemid": "N/A", "alert_key": "N/A", "alert_message": "Check Proc Num", "alert_zabbix_url": "https://blah.com", "alertcount": "1", "alertid": "41009", "checkcount": "13", "current_state": "problem", "groups": ["Linux_servers--2", "blah2" ], "hostid": "10439", "hostip": "blah", "hostname": "blah", "value": "N/A" }

我希望时间戳排在第一位,因为我在 myjson 变量中设置的原始数据中指定了它。

我用谷歌搜索了这个,但没有找到可行的解决方案。出于可移植性的原因,我希望仅使用默认的 python 库/模块来解决这个问题。

4

1 回答 1

2

值得注意的是,这不是真正的 JSON,而是 Python 字典文字。字典本质上是一种无序的数据类型。

另一种方法是collections.OrderedDict从标准库中使用:一个确实保持其键有序的字典。但这看起来不像 JSON,因为它必须使用普通的构造函数进行初始化:

my_dict = OrderedDict(timestamp='...', account_name='...', ...)

现在您可以在大多数方面像普通字典一样对待my_dict,但对其进行迭代将使键保持原始顺序。

另请注意,根据其规范,JSON 并不关心对象中键的顺序。因此,如果您最终将其输出为 JSON 并将其读回,那么订单将消失。

PS 在 CPython 3.6 及更高版本中,普通字典确实有与之关联的顺序。但我猜如果您还没有使用最新的 CPython,那么为此更改您的解释器并不是一个真正的选择。

编辑:我刚刚了解到字典将在从 3.7 开始的所有实现中保留顺序。但以上观点成立。如果您尚未使用具有此功能的实现/版本,则切换到 Python 的全新实现比导入collections.OrderedDict.

于 2019-05-23T01:53:39.820 回答