Python中对象数组过滤数据为空,如何正确获取字段值?
问题:Python过滤JSON数据结果为空的排查与修复
需求是从JSON对象列表中筛选满足以下条件的对象:
type等于"answer"rubric.id属于指定值列表segments数组中存在指定id的元素
但执行现有过滤代码后,filtered_data始终为空,以下是原始JSON数据和代码:
原始JSON数据
[ { "_id": "1", "type": "answer", "segments": [ { "slug": "employees", "title": "employees", "id": "111111" }, { "slug": "middle-employees", "title": "М", "id": "22222222" } ], "rubric": { "slug": "online", "title": "deal", "id": "123" } }, { "_id": "2", "type": "instruction", "segments": [ { "slug": "employees", "title": "employees", "id": "111111" }, { "slug": "middle-employees", "title": "М", "id": "22222222" } ], "rubric": { "slug": "offline", "title": "off", "id": "345" } } ]
原始Python代码
def get_data_from_json(self, json_data): data = json.loads(json_data) filtered_data = [ item for item in data if hasattr(item, "segments") and len(item["segments"]) != 0 and any(seg_id in item["segments"]["id"] for seg_id in filter_config["segment_ids"]) and item["rubric"]["id"] in filter_config["rubric_ids"] and item.get("type") == "answer" ] # 后续将使用filtered_data
错误原因分析
hasattr误用:JSON加载后得到的是Python字典,不是类实例,hasattr(item, "segments")永远返回False,直接导致所有元素被过滤。应该用"segments" in item来检查键是否存在。segments遍历错误:item["segments"]是数组(列表),不能直接通过item["segments"]["id"]访问元素的id,需要遍历数组中的每个元素,取出id再判断是否在目标列表中。- 冗余判断:
len(item["segments"]) != 0可以省略,因为如果segments是空数组,any()会返回False,已经能满足非空的隐含要求。
修正后的代码
def get_data_from_json(self, json_data): data = json.loads(json_data) filtered_data = [ item for item in data if "segments" in item and any(seg["id"] in filter_config["segment_ids"] for seg in item["segments"]) and item["rubric"]["id"] in filter_config["rubric_ids"] and item.get("type") == "answer" ] # 后续使用filtered_data
关键修改点说明:
- 用
"segments" in item替代hasattr(item, "segments"),正确检查字典键存在 - 将
any(seg_id in item["segments"]["id"] ...)改为any(seg["id"] in ... for seg in item["segments"]),正确遍历segments数组中的每个元素并提取id - 移除冗余的
len(item["segments"]) != 0判断,简化逻辑
假设filter_config中segment_ids包含"111111"或"22222222",且rubric_ids包含"123",修正后的代码会正确筛选出第一个对象。
内容的提问来源于stack exchange,提问作者NeverSleeps
相关产品推荐
相关产品推荐

