Я предполагаю, что ваш файл JSON будет декодирован в список словарей. Сначала нам нужна функция, которая сгладит объекты JSON:
defflattenjson(b, delim): val = {} for i in b.keys(): ifisinstance(b[i], dict): get = flattenjson(b[i], delim) for j in get.keys(): val[i + delim + j] = get[j] else: val[i] = b[i]
return val
Результат выполнения этого фрагмента для вашего объекта JSON:
columns = [x for row ininputfor x in row.keys()] columns = list(set(columns))
запустить это несложно через модуль csv:
withopen(fname, 'wb') as out_file: csv_w = csv.writer(out_file) csv_w.writerow(columns)
for i_r ininput: csv_w.writerow(map(lambda x: i_r.get(x, ""), columns))
Ответ 4
JSON может представлять широкий спектр структур данных - JS "объект" примерно похож на Python dict (со строковыми ключами), JS "массив" примерно похож на Python list, и вы можете вкладывать их, пока конечными "конечными" элементами являются числа или строки.
CSV может по существу представлять только двумерную таблицу - необязательно с первой строкой "заголовков", то есть "имен столбцов", что может сделать таблицу интерпретируемой как список dicts, вместо обычной интерпретации, список списков (опять же, "конечными" элементами могут быть числа или строки).
Итак, в общем случае вы не можете преобразовать произвольную структуру JSON в CSV. В нескольких особых случаях вы можете (массив массивов без дальнейшей вложенности; массивы объектов, все из которых имеют абсолютно одинаковые ключи). Какой особый случай, если таковой имеется, применим к вашей проблеме? Детали решения зависят от того, какой особый случай у вас есть. Учитывая удивительный факт, что вы даже не упоминаете, какой из них применим, я подозреваю, что вы, возможно, не учли ограничение, ни один из возможных вариантов на самом деле не применим, и вашу проблему решить невозможно. Но, пожалуйста, поясните!