установить данные Python JSON в определенном порядке - PullRequest
0 голосов
/ 23 мая 2019

У меня есть данные 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 по умолчанию.

1 Ответ

2 голосов
/ 23 мая 2019

Примечательно, что на самом деле это не JSON, это буквальный словарь Python. И словари по своей природе являются неупорядоченным типом данных.

Альтернативой является использование collections.OrderedDict из стандартной библиотеки: словарь, который делает , сохраняя свои ключи в порядке. Но это не будет похоже на JSON, поскольку его нужно инициализировать с помощью обычного конструктора:

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

Теперь вы можете рассматривать my_dict как обычный словарь в большинстве случаев, но итерирование по нему сохранит ключи в вашем первоначальном порядке.

Обратите внимание, что JSON, согласно его спецификации, не заботится о порядке ключей в объекте. Так что если вы в конечном итоге выведите его в формате JSON и прочитаете его обратно, порядок исчезнет.

P.S. В CPython 3.6 и более поздних версиях обычные словари do имеют порядок, связанный с ними. Но я предполагаю, что если вы еще не используете последний CPython, изменить интерпретатор для этого на самом деле не вариант.

EDIT: Я только что узнал , что словари сохранят порядок во всех реализациях, начиная с 3.7. Но точка выше стоит. Если вы уже не используете реализацию / версию с этой функцией, переход на совершенно новую реализацию Python - это гораздо большее изменение, чем импорт collections.OrderedDict.

...