Python中检查JSON数据:递归判断contact_count值的实现问题
帮你解决JSON数据检查与递归逻辑的问题
嗨,我来帮你梳理下当前代码里的问题,然后给出可行的解决方案~
首先,先分析你现有代码里的几个关键问题:
- 变量与数据类型混淆:你定义的
jSon已经是Python字典了,但却用json.loads(jSon)来解析——json.loads()的作用是把JSON格式的字符串转换成Python字典,直接对字典用这个方法会报错哦。 - 错误的数据访问方式:你的JSON结构是字典(
{'contact_list': [], 'contact_count': 0}),但代码里用data[1]['contact_count']去访问,这是数组的索引方式,字典需要用键名来取值,应该是data['contact_count']。 - 无限递归风险:当前递归调用时没有更新数据源,每次都会加载同一个
jSon数据,永远满足contact_count ==0的条件,最终会导致递归深度超出Python的限制,触发栈溢出错误。 - 递归逻辑无出口:没有处理
contact_count >0时的逻辑,无法终止递归。
解决方案:用循环实现轮询(更安全)
递归并不适合这种需要持续检查数据更新的场景,循环的方式更稳定,也更容易控制。下面是修正后的代码,模拟了从数据源获取最新JSON数据的过程:
import json # 如果需要延迟检查,引入time模块 # import time def wait_for_valid_contacts(): # 模拟获取最新JSON数据的函数(实际场景替换成你的数据源:API请求、文件读取等) def get_latest_data(): # 这里用计数器模拟数据更新,第三次调用时contact_count变为1 get_latest_data.call_count += 1 if get_latest_data.call_count >= 3: return {"contact_list": [{"id": 1, "name": "Alice"}], "contact_count": 1} else: return {"contact_list": [], "contact_count": 0} # 初始化模拟计数器 get_latest_data.call_count = 0 while True: current_data = get_latest_data() # 检查contact_count是否大于0 if current_data['contact_count'] > 0: print("找到符合条件的数据!") print("联系人列表:", current_data['contact_list']) return current_data # 返回符合条件的数据,供后续处理 print("当前contact_count为0,等待数据更新...") # 可选:添加延迟,避免频繁请求数据源 # time.sleep(1) # 调用函数 wait_for_valid_contacts()
如果一定要用递归实现
如果你坚持要用递归,必须确保每次递归都能获取到最新的数据,并且有明确的终止条件:
import json # import time def check_contacts_recursively(): def get_latest_data(): get_latest_data.call_count += 1 if get_latest_data.call_count >= 3: return {"contact_list": [{"id": 2, "name": "Bob"}], "contact_count": 1} else: return {"contact_list": [], "contact_count": 0} get_latest_data.call_count = 0 current_data = get_latest_data() if current_data['contact_count'] > 0: print("递归找到符合条件的数据!") return current_data else: print("递归检查中:contact_count为0,继续...") # 可选:添加延迟 # time.sleep(1) return check_contacts_recursively() # 调用递归函数 check_contacts_recursively()
关键注意点
- 区分JSON字符串与Python字典:如果你的数据源返回的是JSON格式的字符串,才需要用
json.loads(字符串)转换成字典;如果已经是字典,直接使用即可。 - 避免无限循环/递归:必须保证数据源会在某个时刻更新,让
contact_count大于0,否则程序会一直运行下去。 - 递归深度限制:Python默认的递归深度是1000,如果需要等待很长时间才会有数据更新,建议优先使用循环,避免栈溢出。
内容的提问来源于stack exchange,提问作者J_C
相关产品推荐
相关产品推荐

