处理的原始json总共有四层,长下面这个样子:
要求:(1)给定要解析的层数,要解几层解几层,若内层还有对象,则整个对象作为统一字符串处理
(2)将解析出的json处理成insert语句,即insert into table_name(xxxx,xxxx,xxx)values(xxxx,xxxx,xxx)
实现过程:
(1)先写一个函数用来判断所给的json的层数,思路就是将json读取为字符串,并将'{'的位置存为列表pos1,然后读取第一个'}'的位置pos2,遍历列表pos1,当pos2首次小于pos1中i位置处的元素时,i就是层数,如果一直不小于,那么pos1的长度就是json的层数。
def get_json_nums_of_layers(file_path):
fo=open(file_path,'r',encoding='utf-8')
jsonstr = fo.read()#将json作为整个的字符串读取进去
pos1=list()#用于存放
for m in re.finditer('{', jsonstr):
pos1.append(m.start())
# print(pos1)
pos2=jsonstr.find('}')
# print(pos2)
for i in range(len(pos1)):
if pos1[i]>pos2:
return i
else:
return len(pos1)
fo.close()
(2)递归处理json,将之处理成字段名:数据 的格式,因为是用递归来处理的,所以要确定好递归结束的条件,思路就不说了,递归这种东西都是debug后慢慢调试出来的。可能是我这种技术渣的人的傻子处理方式吧,hhhhh
def get_json(file_path,nums_layer_toget,file_path_to_write):
s=''#s是用于放字段名的
v=''#v用于放记录的
ff=open(file_path_to_write,'w',encoding='utf-8')
obj={}
num=1
if(nums_layer_toget>get_json_nums_of_layers(file_path)):
print("所要解析的层数超过该json拥有的层数!请修正")
else:
fo=open(file_path,'r',encoding='utf-8')
jsonstr = fo.read()
jsonstr=js.loads(jsonstr)
get_json_operation('list',jsonstr, nums_layer_toget,obj,ff,s,v)
ff.close()
fo=open(file_path_to_write,'r',encoding='utf-8')
ff=open('C:\\Users\\pt0521\\Desktop\\liyang.txt','w',encoding='utf-8')
line=fo.readline()
while line: