读取JSON文件遇TypeError及列表存储返回None问题求助
解决读取JSON存入列表时的
NoneType迭代错误 嘿,我来帮你捋捋这个问题!你遇到的TypeError: 'NoneType' object is not iterable通常有两种常见原因,结合你描述的情况,咱们一步步排查:
首先,检查JSON加载是否完整正确
看你贴的代码里json_fil...明显没写完——这很可能是第一个坑!如果没有正确执行json.load(f)把文件内容解析成Python对象,那后续的变量大概率是None,自然没法迭代。
先把加载代码补全,还可以加些调试和异常处理,避免踩文件找不到或JSON格式错误的坑:
import os import json MainDir = "F:/Protocols/20180207-Iteration/" os.chdir(MainDir) try: with open("rout.json",'r',encoding='utf-8') as f: json_data = json.load(f) # 关键:完整加载JSON数据 # 先打印看看数据结构,确认是不是你预期的格式 print("JSON加载成功,类型是:", type(json_data)) print("原始数据内容:", json_data) except FileNotFoundError: print("糟了,找不到rout.json文件!") except json.JSONDecodeError: print("JSON格式有问题,检查一下文件里的语法是否正确(比如逗号、括号配对)")
然后,确认你取到的name值不是None
你说“变量已获取JSON文件中key为name的第一个字典值”,但有可能这个值本身就是None,或者你取的方式不对导致拿到None。比如:
- 如果JSON里第一个字典根本没有
name键,用json_data[0]["name"]会直接报错,但如果用get方法(json_data[0].get("name"))就会返回None; - 或者JSON里
name对应的value就是null(JSON里的null对应Python的None)。
所以取到值之后先做个判断,再往列表里加:
name_list = [] # 先确认json_data是列表,且里面有元素 if isinstance(json_data, list) and len(json_data) > 0: first_dict = json_data[0] # 确认第一个元素是字典,且包含name键 if isinstance(first_dict, dict) and "name" in first_dict: target_name = first_dict["name"] if target_name is not None: name_list.append(target_name) print("成功添加到列表:", name_list) else: print("注意:第一个字典的name值是None哦!") else: print("不对啊,第一个元素不是字典,或者没有name这个键") else: print("JSON数据不是非空列表,和你预期的结构不一样!")
最后,排查是不是你迭代了None值
如果前面的步骤都没问题,但还是报错,那大概率是你后续代码里尝试迭代这个None值了。比如你写了:
# 错误示例:如果target_name是None,这里直接炸 for item in target_name: do_something(item)
这时候一定要先判断值不为None再迭代:
if target_name is not None: for item in target_name: do_something(item) else: print("没法迭代,target_name是None")
总的来说,核心就是:先确认JSON加载正常,再确认取到的目标值不是None,最后确保不会去迭代None。通过打印中间变量,很容易就能找到问题出在哪~
内容的提问来源于stack exchange,提问作者suraj das
相关产品推荐
相关产品推荐

