Уведомления

Группа в Telegram: @pythonsu

#1 Март 23, 2017 16:39:28

grandfa8
Зарегистрирован: 2017-02-27
Сообщения: 13
Репутация: +  0  -
Профиль   Отправить e-mail  

Перемешиваются ключи в json

Всем привет!

Есть задача, побить большой json на отдельные файлы более меньшего размера, для удобочитаемости.

 import json
import os
from collections import OrderedDict
with open('chaining.json') as tdata:
    tevents = json.load(tdata)
id_event = 1
for event in tevents:
    if id_event == 2:
        print('id not equal 1')
        break
    path = '{0}_{1}'.format(id_event, event)
    os.mkdir(path)
    event_name = '{0}.json'.format(path)
    path_json = os.path.join(path, event_name)
    
    with open(path_json, 'w') as tjson:  
        tevent ={event: tevents[event]}
        json.dump(tevent, tjson, indent=4, sort_keys=True)
    id_event += 1
Разбить получилось, но ключи в каждом отдельном json после разбиения перемешиваются.
К примеру есть у меня json:
{
“A”: {
“key1”: “value1”,
“key2”: “value2”

},

“B”: {
“key1”: “value1”,
},
“C”: {
“key1”: “value1”
}
}

На выходе я получаю 3 json'а:
1ый json:
{
“key2”: “ value2,”
“key1”: “value1”

}

2ый json:
{
“key1”: “value1,”
}

3ий json:
{
“key1”: “value1”
}

То есть в итоге получается что в jsonгде больше одного ключа они перемешиваются рандомно, а мне нужно как-то сделать так чтобы они не перемешивались.
Смотрел в сторону collections.OrderedDict, но воспользоваться им нормально ума так и не хватило
Заранее благодарен за любую помощь!





Отредактировано grandfa8 (Март 23, 2017 17:03:07)

Офлайн

#2 Март 23, 2017 20:08:58

doza_and
От:
Зарегистрирован: 2010-08-15
Сообщения: 4138
Репутация: +  252  -
Профиль   Отправить e-mail  

Перемешиваются ключи в json

grandfa8
где больше одного ключа они перемешиваются рандомно
Не сделаете вы чтобы они не перемешивались. Стандарт json прямо говорит - словарь неупорядоченное множество. Драйверы записи могут записывать данные как хотят в любом порядке. Если нужно сохранить порядок используйте списки.



Офлайн

#3 Март 23, 2017 20:22:33

PEHDOM
Зарегистрирован: 2016-11-28
Сообщения: 2196
Репутация: +  294  -
Профиль   Отправить e-mail  

Перемешиваются ключи в json

Попробуйте OrderedDict из collections он запоминает порядок добавления ключей
https://docs.python.org/3/library/collections.html#collections.OrderedDict



==============================
Помещайте код в теги:
[code python][/code]
Бериегите свое и чужое время.

Отредактировано PEHDOM (Март 23, 2017 20:22:55)

Офлайн

#4 Март 24, 2017 03:59:14

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Перемешиваются ключи в json

  
>>> import json
>>> import collections
>>> 
>>> s = """{"a": 1, "c": 3, "b": 2}"""
>>> 
>>> out = json.loads(s)
>>> out
{'b': 2, 'c': 3, 'a': 1}
>>> 
>>> 
>>> def f(arg):
...     print(arg)
... 
>>> json.loads(s, object_pairs_hook=f)
[('a', 1), ('c', 3), ('b', 2)]
>>> 
>>> 
>>> outd = json.loads(s, object_pairs_hook=collections.OrderedDict)
>>> outd
OrderedDict([('a', 1), ('c', 3), ('b', 2)])
>>> 
>>> 
>>> json.dumps(out)
'{"b": 2, "c": 3, "a": 1}'
>>> 
>>> json.dumps(outd)
'{"a": 1, "c": 3, "b": 2}'
>>>



Офлайн

#5 Март 24, 2017 08:58:00

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Перемешиваются ключи в json

doza_and
Согласен. json приезжает как хочет.

grandfa8
Поэтому можно или просто сделать дополнительный инкрементный ключ для сортировки. Другого варианта предложить сложно. Мало того, все же рассмотрите вариант, когда передается не словарь, а все-таки список со словарями внутри, где каждый словарь фактически Ваше поле.

Офлайн

#6 Март 24, 2017 12:50:21

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Перемешиваются ключи в json

4kpt_V
Согласен. json приезжает как хочет.
Там можно напрямую читать, как оно записано в файле.



Офлайн

#7 Март 24, 2017 12:51:16

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Перемешиваются ключи в json

py.user.next
А Вы уверены, что всегда на стороне клиента это упаковывается как подается?

Офлайн

#8 Март 24, 2017 14:07:17

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Перемешиваются ключи в json

4kpt_V
А Вы уверены, что всегда на стороне клиента это упаковывается как подается?
Да можно и на стороне клиента то же самое сделать. У него вопрос так и не стоял, что там на стороне клиента. Он спросил, можно ли туда-сюда провести изменения json-файла, сохраняя порядок всего. Бывают программы, где для красивости определённый порядок больше подходит. Сам формат хранения это не нарушает и возможность сделать такое есть.



Офлайн

#9 Март 24, 2017 14:51:20

4kpt_V
От: Харьков
Зарегистрирован: 2017-02-19
Сообщения: 299
Репутация: +  12  -
Профиль   Отправить e-mail  

Перемешиваются ключи в json

Это противоречит формату. Как-бы не логично. Хотя желание и может возникать. Просто когда на другой стороне что-то поменяется то на этой будет писец адовый. Потому как когда на той стороне меняли, то не знали, что оказывается json могут использовать для последовательного хранения. Потому как сама спецификация говорит об обратном…

Отредактировано 4kpt_V (Март 24, 2017 14:51:53)

Офлайн

#10 Март 25, 2017 00:52:18

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9716
Репутация: +  842  -
Профиль   Отправить e-mail  

Перемешиваются ключи в json

Да он может и внутренне использоваться, многие программы используют его внутренне (вместо xml). qutIM, Sublime Text. А на другой стороне может стоять точно такая же программа, поддерживающая упорядоченность. И ещё человек может влазить руками (наверное, для этого упорядоченность и нужна, чтобы человек не путался).



Отредактировано py.user.next (Март 25, 2017 00:56:50)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version