You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让当前函数获取另一函数返回的列表而非字符串?

问题描述

我正在开发一个获取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 22:35:38