Найти - Пользователи
Полная версия: Теряется сортировка словаря после обработки Json.loads()
Начало » Python для новичков » Теряется сортировка словаря после обработки Json.loads()
1
DevPy
Есть данные json заданные неизменяемым словарем (OrderedDict)
у которого задан заранее мне неизвестный набор ключей, но очень нужно помнить порядок этих ключей.
После кодирования данных simplejson.loads() порядок ключей теряется… А это недопустимо для меня. Как сделать так, чтобы порядок не изменялся??
Ниже привожу код и пример с незакодированными символами, чтобы было удобнее читать

import simplejson
data = '{"ключ 2.2":{"но":"ыпар","очень":"ыапр","важна":"ыапр","их":"ыпр","очередность":"ыапр"},"ключ 2.1":{"разнообразный":"ыап","набор":"апр","ключей":"ывап","который":"фвап","заранее":"ывап","мне":"ыап","неизвестен":"ывап"}}'
data1 = simplejson.loads(data)
print data1
# Выводит следующее:
# {"ключ 2.1":{"заранее":"ывап","ключей":"ывап","мне":"ыап","неизвестен":"ывап","разнообразный":"ыап","набор":"апр","который":"фвап"},"ключ 2.2":{"очень":"ыапр","очередность":"ыапр","но":"ыпар","важна":"ыапр","их":"ыпр"}}


Для удобочитаемости привожу разложенный JSON до и после
# До кодирования
{
"ключ 2.2": {
"но": "ыпар",
"очень": "ыапр",
"важна": "ыапр",
"их": "ыпр",
"очередность": "ыапр"
},
"ключ 2.1": {
"разнообразный": "ыап",
"набор": "апр",
"ключей": "ывап",
"который": "фвап",
"заранее": "ывап",
"мне": "ыап",
"неизвестен": "ывап"
}
}

# После кодирования меняется порядок
{
"ключ 2.1": {
"заранее": "ывап",
"ключей": "ывап",
"мне": "ыап",
"неизвестен": "ывап",
"разнообразный": "ыап",
"набор": "апр",
"который": "фвап"
},
"ключ 2.2": {
"очень": "ыапр",
"очередность": "ыапр",
"но": "ыпар",
"важна": "ыапр",
"их": "ыпр"
}
}
FishHook
Как обычно это бывает, скорее всего Вы решаете задачу не тем способом или не теми инструментами. Зачем Вам понадобился порядок следования элементов словаря?
reclosedev
from collections import OrderedDict
simplejson.loads(data, object_pairs_hook=OrderedDict)
http://simplejson.readthedocs.org/en/latest/#simplejson.load
В json из стандартной библиотеки тоже такое есть.

upd:
FishHook
Зачем Вам понадобился порядок следования элементов словаря?
Не знаю нужно ли это в конкретном случае, но например, если данные меняются и их нужно сохранить обратно в файл, файлы эти потом проще сравнивать (особенно если они находятся под контролем системы версий). Или ключи словарей должны отображаться пользователю в порядке, задуманном автором json файла.
ziro
В json из стандартной библиотеки тоже такое есть.

Только для 2.7, если точно.
DevPy
reclosedev
from collections import OrderedDict
simplejson.loads(data, object_pairs_hook=OrderedDict)
reclosedev Спасибо за ответ - заработало!
Я же неправильно пытался использовать OrderedDict…

FishHook
reclosedev дал ответ на ваш вопрос, который подходит для меня
odnochlen
reclosedev, все-таки мне кажется, что json ты используешь немного не по назначению. Во всех ли языках/библиотеках можно сохранить порядок ключей?

Кстати, 600.
DevPy
Теперь другая похожая проблема…
Закидываю данные в БД MongoDB
# data является неизменяемым списком (OrderedDict)
PyMongo.db['NAMEDB'].update({'_id': ID}, data)
и снова теряется порядок, но уже в БД Mongo…

Не нашел никакого доп. параметра, чтобы можно было бы отправить с запросом update() для “не изменения сортировки”.
Есть ли какой-нибудь вариант решения?
odnochlen
DevPy, ты, по-моему, используешь средства не по назначению.

Нужен порядок - делай двумерный список.
reclosedev
DevPy
и снова теряется порядок, но уже в БД Mongo…
Внести данные в Mongo в нужном порядке с помощью OrderedDict или SON можно, а вот возвращается все равно обычный dict.
odnochlen
reclosedev, я это и имел в виду, когда спрашивал, все ли модули поддерживают сохранение порядка ключей. Имхо на такое применение их никто не рассчитывал.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB