需要导入的文件格式如下,要把data-diff数组里的所有元素导进去,对于某些json文件还需要添加日期字段。
{
"rc": 0,
"rt": 6,
"data":{
"total": 197,
"diff": [
{
"f1": 1,
"f2": 295.5,
"f3":{ "f4":12, "f5":13},
...
},
{ "f1": 2,
"f2": 39.5,
"f3":{ "f4":10, "f5":15},
...
},
...
}
}
对于上面的文件,最终导入的效果:
select * from tableLoaded;
f1 | f2 | f4 | f5 |
---|---|---|---|
1 | 295.5 | 12 | 13 |
2 | 39.5 | 10 | 15 |
主代码:
import json
import os
import pandas as pd
def load_json(json_file,key_path):
'''
:param json_file: json文件的绝对路径,文件名必须是类型_YYYYMMDD.json的格式,如 D:\\xx\\00复盘\\data\\dbRank\\dbRank_20241224.json
:param key_path: 需要导入的数组的路径['result','data']
:return:
'''
table_name = json_file.split('\\')[-2] # 文件夹名称即是要导入的表名称
with open(json_file,'r',encoding='UTF-8') as f:
data = json.load(f)
if len(key_path) > 1: # 如果参数有给键的路径
for path in key_path: # 遍历到最后一层
data = data[path]
if(table_name == 'xxx' ): # 如果是要添加日期字段的数据
zt_date = get_ztdate_from_path(json_file) # 从文件名获取日期
data = flatten_dict_arr(data,zt_date) # 给数组所有元素加上日期字段
df = pd.DataFrame(data) # 把处理后的数组构建成dataFrame
df.to_sql(table_name, con=engine, if_exists='append', index=False)
def get_ztdate_from_path(path):
'''
:param path: json文件的绝对路径,文件名必须是类型_YYYYMMDD.json的格式,如 D:\\xx\\00复盘\\data\\dbRank\\dbRank_20241224.json
:return: 日期,如20241224
'''
return path.split('\\')[-1].split('.')[0][-8:]
def flatten_dict_arr(arr,zt_date=False):
res = []
for item in arr:
if zt_date:
item['zt_date'] = zt_date
res.append(flatten_dict(item))
return res
def flatten_dict(nested_dict):
"""
将嵌套字典平铺为单层字典。
参数:
nested_dict -- 要平铺的嵌套字典
返回:
平铺后的字典
"""
items = []
for key, value in nested_dict.items():
if isinstance(value, dict):
items.extend(flatten_dict(value).items())
else:
items.append((key, value))
return dict(items)
标签:json,dict,key,mysql,zt,path,data,pandas
From: https://www.cnblogs.com/stxz/p/18628003