Уведомления

Группа в Telegram: @pythonsu

#1 Окт. 26, 2012 07:28:54

DevPy
Зарегистрирован: 2012-09-21
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Теряется сортировка словаря после обработки Json.loads()

Есть данные 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": {
"очень": "ыапр",
"очередность": "ыапр",
"но": "ыпар",
"важна": "ыапр",
"их": "ыпр"
}
}

Офлайн

#2 Окт. 26, 2012 08:34:56

FishHook
От:
Зарегистрирован: 2011-01-08
Сообщения: 8312
Репутация: +  568  -
Профиль   Отправить e-mail  

Теряется сортировка словаря после обработки Json.loads()

Как обычно это бывает, скорее всего Вы решаете задачу не тем способом или не теми инструментами. Зачем Вам понадобился порядок следования элементов словаря?



Офлайн

#3 Окт. 26, 2012 09:31:43

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Теряется сортировка словаря после обработки Json.loads()

from collections import OrderedDict
simplejson.loads(data, object_pairs_hook=OrderedDict)
http://simplejson.readthedocs.org/en/latest/#simplejson.load
В json из стандартной библиотеки тоже такое есть.

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

Отредактировано reclosedev (Окт. 26, 2012 09:42:33)

Офлайн

#4 Окт. 26, 2012 09:32:59

ziro
От:
Зарегистрирован: 2009-08-13
Сообщения: 225
Репутация: +  8  -
Профиль   Отправить e-mail  

Теряется сортировка словаря после обработки Json.loads()

В json из стандартной библиотеки тоже такое есть.

Только для 2.7, если точно.



Отредактировано ziro (Окт. 26, 2012 09:35:09)

Офлайн

#5 Окт. 26, 2012 12:57:17

DevPy
Зарегистрирован: 2012-09-21
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Теряется сортировка словаря после обработки Json.loads()

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

FishHook
reclosedev дал ответ на ваш вопрос, который подходит для меня

Отредактировано DevPy (Окт. 26, 2012 12:57:35)

Офлайн

#6 Окт. 26, 2012 13:13:33

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Теряется сортировка словаря после обработки Json.loads()

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

Кстати, 600.

Отредактировано odnochlen (Окт. 26, 2012 13:13:47)

Офлайн

#7 Окт. 26, 2012 13:23:47

DevPy
Зарегистрирован: 2012-09-21
Сообщения: 12
Репутация: +  0  -
Профиль   Отправить e-mail  

Теряется сортировка словаря после обработки Json.loads()

Теперь другая похожая проблема…
Закидываю данные в БД MongoDB

# data является неизменяемым списком (OrderedDict)
PyMongo.db['NAMEDB'].update({'_id': ID}, data)
и снова теряется порядок, но уже в БД Mongo…

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

Офлайн

#8 Окт. 26, 2012 16:04:13

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Теряется сортировка словаря после обработки Json.loads()

DevPy, ты, по-моему, используешь средства не по назначению.

Нужен порядок - делай двумерный список.

Офлайн

#9 Окт. 26, 2012 16:28:40

reclosedev
От: Н.Новгород
Зарегистрирован: 2012-03-29
Сообщения: 870
Репутация: +  173  -
Профиль   Отправить e-mail  

Теряется сортировка словаря после обработки Json.loads()

DevPy
и снова теряется порядок, но уже в БД Mongo…
Внести данные в Mongo в нужном порядке с помощью OrderedDict или SON можно, а вот возвращается все равно обычный dict.

Офлайн

#10 Окт. 26, 2012 23:41:50

odnochlen
Зарегистрирован: 2012-06-28
Сообщения: 794
Репутация: +  14  -
Профиль   Отправить e-mail  

Теряется сортировка словаря после обработки Json.loads()

reclosedev, я это и имел в виду, когда спрашивал, все ли модули поддерживают сохранение порядка ключей. Имхо на такое применение их никто не рассчитывал.

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version