как сохранить порядок отсортированного словаря, переданного в функцию jsonify ()? - PullRequest
0 голосов
/ 30 января 2019

Я пытаюсь передать отсортированный словарь в функцию jsonify (), а затем использовать его из кода JS для извлечения значений.Я вижу, что хотя я передаю правильные значения, они по какой-то причине переупорядочиваются с помощью jsonify.


json_data = {
    "11": {
        "j_id": "out",
    },
    "aa": {
        "j_id": "in",
    },
    "bb": {
        "j_id": "out",
    },
}

jkeys=json_data.keys()
sorted_json = sorted(jkeys, key=lambda x: json_data[x]['j_id'], reverse=False)

new_sorted=OrderedDict()
for rec in sorted_json:
    new_sorted[rec]=json_data[rec]

print('sort dict: {}'.format(new_sorted))

Вывод правильный, и я вижу правильные значения, которые в моем случае должны быть: aa,11, bb

>>> from collections import OrderedDict
>>>
>>> json_data = {
...     "11": {
...         "j_id": "out",
...     },
...     "aa": {
...         "j_id": "in",
...     },
...     "bb": {
...         "j_id": "out",
...     },
... }
>>>
>>> jkeys=json_data.keys()
>>> sorted_json = sorted(jkeys, key=lambda x: json_data[x]['j_id'], reverse=False)
>>>
>>> new_sorted=OrderedDict()
>>> for rec in sorted_json:
...     new_sorted[rec]=json_data[rec]
...
>>> print('sort dict: {}'.format(new_sorted))
sort dict: OrderedDict([('aa', {'j_id': 'in'}), ('11', {'j_id': 'out'}), ('bb', {'j_id': 'out'})])

К сожалению, когда я передаю это в функцию jsonify (), а затем, например, в console.log () вывод данных фляги, порядок становится таким: 11, aa, bb.В дополнение к этому, я провел некоторое исследование и нашел этот ответ stackoverflow, что привело к хорошим примечаниям к документации , в которых четко указано, что установка JSON_SORT_KEYS в False не рекомендуется.Затем я проверил эту проблему с github и похоже, что проблема не полностью решена в колбе.

Как лучше всего исправить ее в моем случае?

1 Ответ

0 голосов
/ 30 января 2019

JSON-объекты - это неупорядоченные структуры , и ваш браузер может легко отбросить порядок ваших ключей JSON снова.

Из стандарта JSON :

Объект - это неупорядоченный набор пар имя / значение.

Смелый акцент мой.Чтобы оставаться совместимым со стандартами, используйте список (массив JSON) для захвата определенного заказа.

При этом можно сделать Flask для сохранения порядка, установленного с помощью OrderedDict.

  • Отключить сортировку всего приложения, используя JSON_SORT_KEYS = False.

    С этим параметром по умолчанию True, jsonify() сортирует ключи для предоставлениястабильные ответы HTTP, которые кешируются.Документация предупреждает о том, что не следует отключать это, чтобы вы знали о недостатках установки этого значения в False.

    Однако, если вы используете Python 3.6 или новее, эта проблема на самом деле не играет, поскольку с этой версиейвстроенный dict тип также сохраняет порядок вставки , поэтому нет проблем с изменением порядка с одного запуска Python на следующий.

  • Вместоиспользования jsonify(), используйте flask.json.dumps() напрямую и создайте свой собственный объект Response.Пропуск sort_keys=False:

    from flask import json
    
    response = current_app.response_class(
        json.dumps(new_sorted, sort_keys=False),
        mimetype=current_app.config['JSONIFY_MIMETYPE'])
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...