Форум сайта python.su
0
Есть данные json заданные неизменяемым словарем (OrderedDict)
у которого задан заранее мне неизвестный набор ключей, но очень нужно помнить порядок этих ключей.
После кодирования данных simplejson.loads() порядок ключей теряется… А это недопустимо для меня. Как сделать так, чтобы порядок не изменялся??
Ниже привожу код и пример с незакодированными символами, чтобы было удобнее читать
import simplejson data = '{"ключ 2.2":{"но":"ыпар","очень":"ыапр","важна":"ыапр","их":"ыпр","очередность":"ыапр"},"ключ 2.1":{"разнообразный":"ыап","набор":"апр","ключей":"ывап","который":"фвап","заранее":"ывап","мне":"ыап","неизвестен":"ывап"}}' data1 = simplejson.loads(data) print data1 # Выводит следующее: # {"ключ 2.1":{"заранее":"ывап","ключей":"ывап","мне":"ыап","неизвестен":"ывап","разнообразный":"ыап","набор":"апр","который":"фвап"},"ключ 2.2":{"очень":"ыапр","очередность":"ыапр","но":"ыпар","важна":"ыапр","их":"ыпр"}}
# До кодирования
{
"ключ 2.2": {
"но": "ыпар",
"очень": "ыапр",
"важна": "ыапр",
"их": "ыпр",
"очередность": "ыапр"
},
"ключ 2.1": {
"разнообразный": "ыап",
"набор": "апр",
"ключей": "ывап",
"который": "фвап",
"заранее": "ывап",
"мне": "ыап",
"неизвестен": "ывап"
}
}
# После кодирования меняется порядок
{
"ключ 2.1": {
"заранее": "ывап",
"ключей": "ывап",
"мне": "ыап",
"неизвестен": "ывап",
"разнообразный": "ыап",
"набор": "апр",
"который": "фвап"
},
"ключ 2.2": {
"очень": "ыапр",
"очередность": "ыапр",
"но": "ыпар",
"важна": "ыапр",
"их": "ыпр"
}
}
Офлайн
568
Как обычно это бывает, скорее всего Вы решаете задачу не тем способом или не теми инструментами. Зачем Вам понадобился порядок следования элементов словаря?
Офлайн
173
from collections import OrderedDict simplejson.loads(data, object_pairs_hook=OrderedDict)
FishHookНе знаю нужно ли это в конкретном случае, но например, если данные меняются и их нужно сохранить обратно в файл, файлы эти потом проще сравнивать (особенно если они находятся под контролем системы версий). Или ключи словарей должны отображаться пользователю в порядке, задуманном автором json файла.
Зачем Вам понадобился порядок следования элементов словаря?
Отредактировано reclosedev (Окт. 26, 2012 09:42:33)
Офлайн
8
В json из стандартной библиотеки тоже такое есть.
Отредактировано ziro (Окт. 26, 2012 09:35:09)
Офлайн
0
reclosedevreclosedev Спасибо за ответ - заработало!
from collections import OrderedDict
simplejson.loads(data, object_pairs_hook=OrderedDict)
Отредактировано DevPy (Окт. 26, 2012 12:57:35)
Офлайн
14
reclosedev, все-таки мне кажется, что json ты используешь немного не по назначению. Во всех ли языках/библиотеках можно сохранить порядок ключей?
Кстати, 600.
Отредактировано odnochlen (Окт. 26, 2012 13:13:47)
Офлайн
0
Теперь другая похожая проблема…
Закидываю данные в БД MongoDB
# data является неизменяемым списком (OrderedDict) PyMongo.db['NAMEDB'].update({'_id': ID}, data)
Офлайн
14
DevPy, ты, по-моему, используешь средства не по назначению.
Нужен порядок - делай двумерный список.
Офлайн
173
DevPyВнести данные в Mongo в нужном порядке с помощью OrderedDict или SON можно, а вот возвращается все равно обычный dict.
и снова теряется порядок, но уже в БД Mongo…
Офлайн
14
reclosedev, я это и имел в виду, когда спрашивал, все ли модули поддерживают сохранение порядка ключей. Имхо на такое применение их никто не рассчитывал.
Офлайн