如何高效从REST API返回的混合格式响应中提取指定字段(事件编号与描述)
如何高效从REST API返回的混合格式响应中提取指定字段(事件编号与描述)
嘿,我来给你支个靠谱的招!用切片提取数据确实太脆弱了——只要返回内容的长度、格式稍有变化,代码就会失效。针对你这种情况,最稳妥高效的方式是专门解析XML内容,毕竟适配器返回的Adapter_Output是标准的XML格式,天生就适合做结构化数据提取。
下面是具体的实现步骤和代码:
步骤1:解析外层JSON,取出XML字符串
首先把API返回的JSON响应解析成Python对象,从中提取出XML格式的适配器输出内容:
import json import xml.etree.ElementTree as ET import requests # 你的原有请求代码 headers = {'content-type': 'application/json', 'Authentication-Token': authToken} response = requests.post( 'http://dev.startschools.local:2031/baocdp/rest/process/:ITSM_Interface:IncidentManagement:QueryIncident/execute', headers=headers, data=json.dumps(get_query_inc_json()) ) # 解析外层JSON,拿到XML字符串 response_data = json.loads(response.text) xml_content = response_data[0]['value']
步骤2:解析XML,提取目标字段
接下来用Python内置的xml.etree.ElementTree模块解析XML,遍历每个事件条目,提取事件编号和描述:
# 解析XML内容 root = ET.fromstring(xml_content) # 初始化存储结果的列表 incident_numbers = [] descriptions = [] # 遍历所有事件条目 for entry in root.findall('.//entry'): # 提取事件编号 inc_num = entry.find("./field[@name='Incident Number']").text # 提取描述 desc = entry.find("./field[@name='Description']").text # 添加到对应列表 incident_numbers.append(inc_num) descriptions.append(desc) # 查看结果 print("事件编号列表:", incident_numbers) print("描述列表:", descriptions)
运行这段代码后,你就能得到想要的两个列表:
事件编号列表: ["INC000021", "INC000035"] 描述列表: ["Student needs a new card issued", "Students cannot access the text book portal"]
额外优化:用字典列表关联字段(更推荐)
如果后续需要同时处理事件编号和描述,把它们放在同一个字典里会更方便,避免索引错位的问题:
incidents = [] for entry in root.findall('.//entry'): inc_num = entry.find("./field[@name='Incident Number']").text desc = entry.find("./field[@name='Description']").text incidents.append({ "incident_number": inc_num, "description": desc }) # 遍历使用示例 for inc in incidents: print(f"事件{inc['incident_number']}: {inc['description']}")
这种方法的优势在于:不管返回多少条事件,或者XML里的字段顺序如何变化,只要字段的name属性不变,就能准确提取数据,完全不用依赖字符串切片这种不稳定的方式。
备注:内容来源于stack exchange,提问作者Dinerz
相关产品推荐
相关产品推荐

