Как упоминалось в предыдущих ответах, трудность преобразования json в csv заключается в том, что json-файл может содержать вложенные словари и, следовательно, быть многомерной структурой данных, а csv представляет собой структуру данных 2D. Однако хороший способ превратить многомерную структуру в csv состоит в том, чтобы иметь несколько csvs, которые объединяются с первичными ключами.
В вашем примере первый вывод csv имеет столбцы «pk», «model», , "поля" в качестве столбцов. Значения для «pk» и «model» легко получить, но поскольку столбец «поля» содержит словарь, он должен быть его собственным csv, и поскольку «кодовое имя» появляется как первичный ключ, вы можете использовать его как вход для «полей» для завершения первого сеанса. Второй csv содержит словарь из столбца «поля» с кодовым именем в качестве первичного ключа, который можно использовать для связывания двух csvs вместе.
Вот решение для вашего json-файла, который преобразует вложенные словари до 2 csvs.
import csv
import json
def readAndWrite(inputFileName, primaryKey=""):
input = open(inputFileName+".json")
data = json.load(input)
input.close()
header = set()
if primaryKey != "":
outputFileName = inputFileName+"-"+primaryKey
if inputFileName == "data":
for i in data:
for j in i["fields"].keys():
if j not in header:
header.add(j)
else:
outputFileName = inputFileName
for i in data:
for j in i.keys():
if j not in header:
header.add(j)
with open(outputFileName+".csv", 'wb') as output_file:
fieldnames = list(header)
writer = csv.DictWriter(output_file, fieldnames, delimiter=',', quotechar='"')
writer.writeheader()
for x in data:
row_value = {}
if primaryKey == "":
for y in x.keys():
yValue = x.get(y)
if type(yValue) == int or type(yValue) == bool or type(yValue) == float or type(yValue) == list:
row_value[y] = str(yValue).encode('utf8')
elif type(yValue) != dict:
row_value[y] = yValue.encode('utf8')
else:
if inputFileName == "data":
row_value[y] = yValue["codename"].encode('utf8')
readAndWrite(inputFileName, primaryKey="codename")
writer.writerow(row_value)
elif primaryKey == "codename":
for y in x["fields"].keys():
yValue = x["fields"].get(y)
if type(yValue) == int or type(yValue) == bool or type(yValue) == float or type(yValue) == list:
row_value[y] = str(yValue).encode('utf8')
elif type(yValue) != dict:
row_value[y] = yValue.encode('utf8')
writer.writerow(row_value)
readAndWrite("data")
Просто привяжите результат к шаблону следующим образом:
export class AppComponent implements OnInit, OnDestroy {
myTime
myInterval
title = 'My First Angular application';
oneHourAgo: string = "";
EightHoursAgo: string = "";
constructor () {}
// you may want to use ngOnInit to call curTime
ngOnInit() {
this.curTime()
this.myInterval = setInterval(() => {
this.curTime()
}, 1000)
}
// if using setInterval then be sure to clean up else it will keep
// firing after the component is destroyed
ngOnDestory() {
clearInterval(this.myInterval)
}
curTime() {
console.log('hello i am updating the displayed time')
this.myTime = moment().format("YYYY-MM-DD HH:mm:ss");
}
}
и в шаблоне HTML для компонента:
<div>{{ myTime }}</div>
Что бы вы ни делали, убедитесь, что curTime () работает называется. Я полагаю, вы называете это в HTML.