Python遍历无根嵌套JSON对象及Scrapy环境报错排查
问题描述
我有一段如下的JSON数据,希望遍历其中的objects数组,打印每个item的object_code值:
{ "count": 3, "objects": [ { "object_code": "HN1059" }, { "object_code": "HN1060" }, { "object_code": "VO1013" } ] }
我尝试了以下代码:
json='{"count": 3,"objects": [{"object_code": "HN1059"},{"object_code": "HN1060"},{"object_code": "VO1013"}]}' for obj in json['objects']: print(obj.get('object_code')) for obj in json[0]['objects']: print(obj.get('object_code'))
两种写法均报错:
TypeError: string indices must be integers
更新1
我在Scrapy类中使用建议的解决方案时仍然报错,完整报错信息:
TypeError: 'NoneType' object is not iterable
报错的完整代码:
import json import scrapy class MySpider(scrapy.Spider): name = 'mytest' start_urls = [] def start_requests(self): s='{"count": 3,"objects": [{"object_code": "HN1059"},{"object_code": "HN1060"},{"object_code": "VO1013"}]}' obj = json.loads(s) for o in obj['objects']: print(o.get('object_code'))
解决方案
初始报错的修复
你犯了一个基础错误:直接把JSON字符串当作Python字典来使用。字符串只能用整数索引,不能用键名,必须先用json.loads()将JSON字符串解析为Python字典/列表后再操作。
修正后的基础代码:
import json # 注意变量名不要用json,避免覆盖内置模块 json_str = '{"count": 3,"objects": [{"object_code": "HN1059"},{"object_code": "HN1060"},{"object_code": "VO1013"}]}' # 解析为Python字典 data = json.loads(json_str) # 遍历objects数组并打印object_code for item in data['objects']: print(item['object_code']) # 用item.get('object_code')可在键不存在时返回None而非报错
Scrapy场景下的问题排查
你提供的Scrapy代码逻辑本身是正确的,固定字符串s解析后obj['objects']是有效数组,不会出现NoneType不可迭代的错误。出现该报错大概率是实际场景中你并非使用固定字符串,而是从响应中获取JSON内容,可能存在以下问题:
- 响应内容无效:如果是从
response中获取数据,确保使用response.text或response.body.decode()拿到正确的JSON字符串,若直接用response.json(),响应格式异常时会返回None。 - JSON格式损坏:检查实际获取的JSON内容是否完整、格式正确,比如是否有额外字符、缺失括号等,导致解析后
objects字段不存在或为None。 - 变量误操作:确认代码中没有对
s或obj做其他修改,导致obj['objects']被置为None。
如果只是测试这段固定代码,直接运行即可正常输出三个object_code值。
内容的提问来源于stack exchange,提问作者Adam
相关产品推荐
相关产品推荐

