python json解析_Python3 解析复杂结构的 json

该博客展示了如何使用Python处理包含列表和字典的复杂JSON数据。通过递归函数`analysis_json_to_dict`,将嵌套的JSON结构转换为扁平化的字典,便于数据操作。示例包括无头JSON数组、有头JSON数组和包含额外JSON字符串的数组。
摘要由CSDN通过智能技术生成

#!/usr/bing/env python

# -*- coding: utf-8 -*-

# @author: xiaoxiao

# @date : 2018/12/7

dt = {}

def analysis_json_to_dict(json):

# 如果传入的json是list

if isinstance(json, list):

# 遍历list的每个元素

for i, val in enumerate(json):

# 如果list的元素是一个字典

if isinstance(val, dict):

analysis_json_to_dict(val)

# 否则,如果不是字典,则构建字典,其中value为''

else:

val_list = '{"' + str(val) + '":' + '""}'

dt.update(eval(val_list))

# 如果传入的json是一个dict

elif isinstance(json, dict):

# print("dict:" + str(json))

# 遍历dict的每组元素

for dict_key in json:

dict_value = json[dict_key]

# 如果dict_value是一个list

if isinstance(dict_value, list):

dt[dict_key] = {}

# 遍历list,可能还有多组dict和其它结构,形如:[{"id" : 1,"name" : "Number1","age" : 11},{"id" : 2,"name" : "Number2","age" : 22},"student"],list里面有两组dict和一个元素student

for i, val in enumerate(dict_value):

# 如果val是一个dict

if isinstance(val, dict):

# 遍历val(dict结构)

for val_k, val_value in val.items():

# 如果当前val_key已经存在于dt的key里面,则追加到这个key对应的value里面

if val_k in dt[dict_key].keys():

# 如果dt[dict_key][val_k]只有一个值,非list结构,则构造一个list,以保存多个值

if not isinstance(dt[dict_key][val_k], list):

# 如果dt[dict_key][val_k]这个值是一个字符串

if type(dt[dict_key][val_k]) is str:

temp_str = str(dt[dict_key][val_k])

dt[dict_key][val_k] = temp_str.strip(',').split(',')

# 如果是int型,则先转成str,然后转换成list保存str,最后转换成list中保存int的值

elif type(dt[dict_key][val_k]) is int:

temp_str = str(dt[dict_key][val_k])

dt[dict_key][val_k] = temp_str.strip(',').split(',')

dt[dict_key][val_k] = [int(i) for i in dt[dict_key][val_k]]

# 如果是float型,则先转成str,然后转换成list保存str,最后转换成list中保存float的值

elif type(dt[dict_key][val_k]) is float:

temp_str = str(dt[dict_key][val_k])

dt[dict_key][val_k] = temp_str.strip(',').split(',')

dt[dict_key][val_k] = [float(i) for i in dt[dict_key][val_k]]

# 如果是bool型,则先转成str,然后转换成list保存str,最后转换成list中保存bool的值

elif type(dt[dict_key][val_k]) is bool:

temp_str = str(dt[dict_key][val_k])

dt[dict_key][val_k] = temp_str.strip(',').split(',')

dt[dict_key][val_k] = [bool(i) for i in dt[dict_key][val_k]]

dt[dict_key][val_k].append(val_value)

# 否则,如果dt[val_k]已经是一个list,则直接追加到后面

else:

dt[dict_key][val_k].append(val_value)

# 否则,如果当前val_key未存在于dt的key里面,则直接添加

else:

dt[dict_key][val_k] = val_value

# 否则,val不是dict,直接构造成dict形式,加入到dt中保存,如:"student":""

else:

val_list = '{"' + str(val) + '":' + '""}'

dt[dict_key].update(eval(val_list))

# 否则,如果dict_value不是一个list

else:

# 如果当前key已经存在于dt里面,则追加到这个key对应的value里面

if dict_key in dt.keys():

# 如果dt保存的value还不是list,则需要构造一个list

if not isinstance(dt[dict_key], list):

# 如果dt[dict_key][val_k]这个值是一个字符串

if isinstance(dt[dict_key], str):

temp_str = str(dt[dict_key])

dt[dict_key] = temp_str.strip(',').split(',')

# 否则,如果是int型或Boolean类型

else:

temp_str = str(dt[dict_key])

dt[dict_key] = temp_str.strip(',').split(',')

dt[dict_key] = [int(i) for i in dt[dict_key]]

dt[dict_key].append(dict_value)

# 否则,如果dt保存的值已经是list,直接追加

else:

dt[dict_key].append(dict_value)

# 如果当前key未存在于dt里面,则直接增加key-value

else:

dt[dict_key] = dict_value

return dt

# 场景一:没有头的json数组

d1 = [{"id" : 1,"name" : "Number1","age" : 11},{"id" : 2,"name" : "Number2","age" : 22},{"id" : "3","name" : "Number3","age" : 33}]

json_to_dict1 = analysis_json_to_dict(d1)

print("场景一结果:" + str(json_to_dict1))

dt.clear() # dt是全局,这里需要dict清除dt,让dt={}

print('-----------------------------------------------------------')

# 场景二:有头的json数组

d2 = {"persons" :[{"id" : 1,"name" : "Number1","age" : 11},{"id" : "2","name" : "Number2","age" : 22},{"id" : 3,"name" : "Number3","age" : 33}]}

json_to_dict2 = analysis_json_to_dict(d2)

print("场景二结果:" + str(json_to_dict2))

dt.clear() # dt是全局,这里需要dict清除dt,让dt={}

print('-----------------------------------------------------------')

# # 场景三:json数组外含有其它json字符串

d3 = {"code" : 200, "persons" :[{"id" : 1,"name" : "Number1","age" : 11},{"id" : True,"name" : "Number2","age" : 22},{"id" : 3,"name" : "Number3","age" : 33}]}

json_to_dict3 = analysis_json_to_dict(d3)

print("场景三结果:" + str(json_to_dict3))

dt.clear() # dt是全局,这里需要dict清除dt,让dt={}

运行结果:

场景一结果:{'id': [1, 2, '3'], 'name': ['Number1', 'Number2', 'Number3'], 'age': [11, 22, 33]}

-----------------------------------------------------------

场景二结果:{'persons': {'id': [1, '2', 3], 'name': ['Number1', 'Number2', 'Number3'], 'age': [11, 22, 33]}}

-----------------------------------------------------------

场景三结果:{'code': 200, 'persons': {'id': [1, True, 3], 'name': ['Number1', 'Number2', 'Number3'], 'age': [11, 22, 33]}}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值