Найти - Пользователи
Полная версия: Перемешиваются ключи в json
Начало » Python для новичков » Перемешиваются ключи в json
1 2 3
grandfa8
Всем привет!

Есть задача, побить большой 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, но воспользоваться им нормально ума так и не хватило
Заранее благодарен за любую помощь!





doza_and
grandfa8
где больше одного ключа они перемешиваются рандомно
Не сделаете вы чтобы они не перемешивались. Стандарт json прямо говорит - словарь неупорядоченное множество. Драйверы записи могут записывать данные как хотят в любом порядке. Если нужно сохранить порядок используйте списки.
PEHDOM
Попробуйте OrderedDict из collections он запоминает порядок добавления ключей
https://docs.python.org/3/library/collections.html#collections.OrderedDict
py.user.next
  
>>> 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}'
>>>
4kpt_V
doza_and
Согласен. json приезжает как хочет.

grandfa8
Поэтому можно или просто сделать дополнительный инкрементный ключ для сортировки. Другого варианта предложить сложно. Мало того, все же рассмотрите вариант, когда передается не словарь, а все-таки список со словарями внутри, где каждый словарь фактически Ваше поле.
py.user.next
4kpt_V
Согласен. json приезжает как хочет.
Там можно напрямую читать, как оно записано в файле.
4kpt_V
py.user.next
А Вы уверены, что всегда на стороне клиента это упаковывается как подается?
py.user.next
4kpt_V
А Вы уверены, что всегда на стороне клиента это упаковывается как подается?
Да можно и на стороне клиента то же самое сделать. У него вопрос так и не стоял, что там на стороне клиента. Он спросил, можно ли туда-сюда провести изменения json-файла, сохраняя порядок всего. Бывают программы, где для красивости определённый порядок больше подходит. Сам формат хранения это не нарушает и возможность сделать такое есть.
4kpt_V
Это противоречит формату. Как-бы не логично. Хотя желание и может возникать. Просто когда на другой стороне что-то поменяется то на этой будет писец адовый. Потому как когда на той стороне меняли, то не знали, что оказывается json могут использовать для последовательного хранения. Потому как сама спецификация говорит об обратном…
py.user.next
Да он может и внутренне использоваться, многие программы используют его внутренне (вместо xml). qutIM, Sublime Text. А на другой стороне может стоять точно такая же программа, поддерживающая упорядоченность. И ещё человек может влазить руками (наверное, для этого упорядоченность и нужна, чтобы человек не путался).
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