Python中如何让JSONPath匹配结果返回非列表格式?
解决JSONPath提取结果为列表的问题
问题原因
你的JSONPath表达式匹配到单个结果,但通过列表推导式把所有匹配值收集成了列表,导致写入输出时字段值是列表类型。
解决方案
方法1:直接提取列表第一个元素(适用于确定有匹配结果的场景)
修改提取后的赋值逻辑,直接取匹配结果的第一个值,同时添加空值处理避免报错:
r = requests.get(api_url) contracts_json = r.json() contact_name_expr = parse('$..records[*].releases[0].parties[0].contactPoint.name') contact_name = contact_name_expr.find(contracts_json)[0].value if contact_name_expr.find(contracts_json) else None email_expr = parse('$..records[*].releases[0].parties[0].contactPoint.email') contact_email = email_expr.find(contracts_json)[0].value if email_expr.find(contracts_json) else None contact_tel_expr = parse('$..records[*].releases[0].parties[0].contactPoint.telephone') contact_tel = contact_tel_expr.find(contracts_json)[0].value if contact_tel_expr.find(contracts_json) else None # 写入输出字典 output_dict['contacts'].append( {'contact_name': contact_name, 'contact_email': contact_email, 'contact_phone': contact_tel})
方法2:一次性提取整个contactPoint对象(更高效)
无需分开提取每个字段,直接获取完整的contactPoint对象,再从中取出所需字段:
r = requests.get(api_url) contracts_json = r.json() # 提取完整的contactPoint对象 contact_point_expr = parse('$..records[*].releases[0].parties[0].contactPoint') contact_point = contact_point_expr.find(contracts_json)[0].value if contact_point_expr.find(contracts_json) else {} # 从对象中提取字段,用get方法避免KeyError contact_name = contact_point.get('name') contact_email = contact_point.get('email') contact_tel = contact_point.get('telephone') # 写入输出字典 output_dict['contacts'].append( {'contact_name': contact_name, 'contact_email': contact_email, 'contact_phone': contact_tel})
方法3:简化列表推导式为单个值
如果坚持使用列表推导式,直接取列表的第一个元素即可:
contact_name = [match.value for match in contact_name_expr.find(contracts_json)][0] if contact_name_expr.find(contracts_json) else None # 同理处理contact_email和contact_tel字段
效果验证
修改后输出将符合期望格式:
"contacts": [ { "contact_name": "Stack Overflow", "contact_email": "stack.overflow@email.com", "contact_phone": "+44 xxx xxx xxx" } ],
内容的提问来源于stack exchange,提问作者h1m aga1n
相关产品推荐
相关产品推荐

