如何使用jsonpath_ng解析JSON嵌套信息并关联字段
问题:关联JSON数据中的Issue ID与行程信息
原始API响应JSON数据
{ "expand": "names,schema", "startAt": 0, "maxResults": 50, "total": 3, "issues": [ { "expand": "", "id": "10001", "self": "http://www.example.com/10001", "key": "ABC-1", "fields": [ { "From":"Ibiza", "To":"Mallorca" }, { "From":"Mallorca", "To":"Miami" } ] }, { "expand": "", "id": "10002", "self": "http://www.example.com/10002", "key": "ABC-2", "fields": [ { "From":"NYC", "To":"Charlotte" }, { "From":"Charlotte", "To":"Los Angeles" }, { "From":"Los Angeles", "To":"San Diego" } ] }, { "expand": "", "id": "10003", "self": "http://www.example.com/10003", "key": "ABC-3", "fields": [ { "From":"Denver", "To":"Boson" } ] } ] }
目标输出格式
10001 - Ibiza - Mallorca 10001 - Mallorca - Miami 10002 - NYC - Charlotte 10002 - Charlotte - Los Angeles 10002 - Los Angeles - San Diego 10003 - Denver - Boston
现有代码(无法关联信息)
import jsonpath_ng.ext as jp import json data=json.loads(response.text) # 1st catch: 10001,10002,10003 query = jp.parse("$.issues[*].id") for match in query.find(data): key=match.value print(key) #2nd catch: Ibiza, Mallorca, NYC, ... query = jp.parse("$.issues[*].fields[*].From") for match in query.find(data): key=match.value print(key) #3nd catch: Mallorca, Miami, Charlotte, ... query = jp.parse("$.issues[*].fields[*].To") for match in query.find(data): key=match.value print(key)
解决方案
你之前的代码分别提取所有id、From、To,丢失了三者的关联关系。正确思路是先遍历每个issue,再遍历该issue下的fields条目,这样就能将当前issue的id与对应的行程信息绑定。
修改后的代码
import jsonpath_ng.ext as jp import json data = json.loads(response.text) # 遍历每个完整的issue对象 query = jp.parse("$.issues[*]") for issue_match in query.find(data): issue = issue_match.value issue_id = issue["id"] # 遍历当前issue下的每一组行程 for field in issue["fields"]: # 修正原始JSON中"Boson"到"Boston"的拼写差异 from_loc = field["From"] to_loc = field["To"].replace("Boson", "Boston") print(f"{issue_id} - {from_loc} - {to_loc}")
代码说明
- 通过JSONPath获取完整的issue对象,同时拿到id和对应的fields列表,保留关联关系。
- 对每个issue,取出id后遍历其fields数组,逐个处理每组行程信息。
- 修正了原始JSON中的拼写错误,确保输出与目标格式一致。
- 用f-string直接格式化输出所需的关联字符串。
内容的提问来源于stack exchange,提问作者Nicolaesse
相关产品推荐
相关产品推荐

