如何让当前函数获取另一函数返回的列表而非字符串?
问题描述
我正在开发一个获取JSON数据的脚本,其中search_obs函数调用API获取JSON数组后,通过json.dumps转换成字符串返回;但create_cts函数需要获取列表类型数据来遍历其中的JSON对象,现在obs变量拿到的是字符串,无法正常遍历。
相关代码及示例数据如下:
search_obs函数
def search_obs(cid): # Call the API response = api_i.get_case_obs(caseId, query={}, sort=['-stte', '+ioc'], range='all') if response.status_code == 200 or response.status_code == 201: # Get response data list = json.dumps(response.json()) return list else: print('Failure: {}/{}'.format(response.status_code, response.text))
create_cts函数
def create_cts(nwd, idd): obs = search_obs(idd) # 检查obs是否为空 if obs != "[]": obj_python = json.loads(json_data) for item in observables: str_item = str(item) str_dbquote = str_item.replace("'","\"") obj_python = json.loads(str_dbquote)
示例JSON数据
[ {"_id": "~81940632", "id": "~81940632", "createdBy": "xxxx", "createdAt": 1672847636169, "_type": "case_artifact", "dataType": "ip", "data": "xxxx", "startDate": 1672847636169, "tlp": 2, "tags": ["ip"], "ioc": false, "sighted": false, "message": "nonne", "reports": {}, "stats": {}, "ignoreSimilarity": false}, { "_id": "~196840", "id": "~196840", "createdBy": "xxxx", "updatedBy": "xxxxx", "createdAt": 1672741863059, "updatedAt": 1672843716872, "_type": "case_artifact", "dataType": "domain", "data": "***@***", "startDate": 1672741863059, "tlp": 2, "tags": ["domai"], "ioc": true, "sighted": false, "message": "", "reports": {}, "stats": {}, "ignoreSimilarity": false } ]
我需要解决的是让create_cts获取到列表类型数据,从而完成遍历操作。
解决方案
1. 修改search_obs函数,直接返回Python列表
response.json()本身会把API返回的JSON数据解析为Python原生的列表/字典对象,不需要用json.dumps转成字符串。修改后的函数如下:
import json def search_obs(cid): # 注意:原代码参数cid未使用,调用API时误用了caseId,建议统一参数名 response = api_i.get_case_obs(cid, query={}, sort=['-stte', '+ioc'], range='all') if response.status_code in (200, 201): # 直接返回可遍历的Python列表 return response.json() else: print('Failure: {}/{}'.format(response.status_code, response.text)) # 返回空列表避免后续遍历报错 return []
2. 修正create_cts函数的错误逻辑
现在obs已经是列表类型,直接遍历即可,原代码中的变量未定义、冗余转换等问题一并修正:
def create_cts(nwd, idd): obs = search_obs(idd) # 直接判断列表是否为空,比字符串比对更可靠 if obs: # 遍历列表中的每个JSON对象(Python字典) for item in obs: # item本身就是字典,可直接访问属性 print(f"ID: {item['_id']}, 类型: {item['dataType']}, 数据: {item['data']}") # 此处添加你的业务处理逻辑
关键说明
- 避免冗余转换:原代码中先转JSON字符串再解析的操作完全多余,还容易引入格式错误。
- 空值检查优化:用
if obs:直接判断列表是否为空,无需比对字符串"[]"。 - 原生数据结构:
response.json()返回的Python列表/字典可直接遍历、访问属性,是处理API数据的最优方式。
内容的提问来源于stack exchange,提问作者Lynow
相关产品推荐
相关产品推荐

