Динамический JSON в Python

1

Мне нужно динамически строить следующую структуру JSON.

json = {
    "mainkey":"val1",
    "key2":[
   {"keya":"val1rec1","keyb":"val2rec1","keyc":"val3rec1"},
   {"keya":"val1rec2","keyb":"val2rec2","keyc":"val3rec2"},
   {"keya":"val1rec3","keyb":"val2rec3","keyc":"val3rec3"},
   {"keya":"val1rec4","keyb":"val2rec4","keyc":"val3rec4"},
   {"keya":"val1rec5","keyb":"val2rec5","keyc":"val3rec5"}
            ]
       }

только "{" keya ":" val1rec1 "," keyb ":" val2rec1 "," keyc ":" val3rec1 "}," rows "итерации", то есть считывание значений из файла CSV, а затем заполнение/создание строк основанный на том, что находится внутри файла CSV.

Поэтому мой псевдокод выглядит примерно так:

#create dict
path = 'somewhere\on\my\disk\file.csv'
json_file = {}
json_file['mainkey'] = "val1" 
#read from CSV file
df1 = pd.read_csv(path, header=None)
    #iterate through csv
for row,s in df1.iterrows():
    number = df1.loc[row,0]
    #I'm reading keyb and keyc values from CSV as well, but for brevity my substitution below is not showing that.... 
    json_file['key2'] = "'keya':'"+str(number)+"','keyb':'whatever','keyc':'whatever'"
print (json_file)

Очевидно, он не создает то, что я ищу выше - отсюда мой пост здесь для помощи.

  • 0
    Не могли бы вы предоставить CSV-файл, с которым вы работаете? По крайней мере, образец.
  • 0
    После дальнейшего просмотра вашего кода, похоже, что вы пытаетесь вручную построить структуру объекта json для key2, но перед этим используете правильную структуру dict. Смотрите мой ответ для более подробной информации.
Теги:

2 ответа

1
Лучший ответ

Похоже, вы пытаетесь создать json-encoder вручную, это не нужно, поскольку в python встроен отличный json-encoder.

Я бы посоветовал создать свой dict с использованием родной структуры данных и использовать встроенные json-utilites. Это приведет к созданию более чистого кода, поддерживающего обслуживание, и менее подвержен ошибкам.

Как это:

import json
# ... Other imports you may have such as pandas


path = "somewhere\on\my\disk\file.csv"
# Initialize dict
data = {"mainkey": "val1", "key2": list()}

# Parse CSV file
df1 = pd.read_csv(path, header=None)
# iterate through csv
for row,s in df1.iterrows():
    number = df1.loc[row,0]

    # I'm reading keyb and keyc values from CSV as well, 
    # but for brevity my substitution below is not showing that.... 
    data['key2'].append({
        "keya":number,
        "keyb":"whatever",
        "keyc":"whatever",
    })

# Print json to stdout/terminal
json_data = json.dumps(data)
print(json.dumps(data, sort_keys=True))

# Save json to file (data.json)
with open("data.json", "w") as output:
    json.dump(data, output, sort_keys=True)
  • 0
    Спасибо, я думаю, что я понимаю ваше предложение - однако, когда я делаю это, JSON не в правильном порядке - «ключ» печатается как последний ключ в файле?
  • 0
    Это не должно иметь значения, поскольку хэш-карты / дикты неупорядочены. Однако в Python 3.6+ дикты сортируются по умолчанию.
Показать ещё 3 комментария
1

Вы переписываете значения key2 пока вы должны добавить их в список:

json_file['key2'] = []
for row,s in df1.iterrows():
    number = df1.loc[row,0]
    json_file['key2'].append({'keya': str(number), 'keyb': 'whatever', 'keyc': 'whatever'})
print (json_file)

Ещё вопросы

Сообщество Overcoder
Наверх
Меню