如何从复杂JSON对象提取指定字段填充projectids字典
Python实现嵌套JSON项目ID映射方案
注意:你初始定义的
projectids字典直接写001作为键在Python 3中是非法语法(会被识别为八进制字面量,直接抛出语法错误),且接口返回的projectid是字符串类型,因此初始字典的键必须统一使用字符串格式,否则会出现类型不匹配无法赋值的问题。
实现逻辑
- 解析GET请求返回的JSON响应为Python字典结构,使用
requests库时可直接调用响应对象的.json()方法完成解析。 - 遍历JSON根节点下的
data数组,逐行读取每个项目条目。 - 对每个条目,提取
attributes子对象中的projectid值,以及条目顶层的UUID格式id值。 - 若提取到的
projectid存在于预定义的projectids字典键中,就将对应键的值更新为当前条目的顶层id。 - 遍历完成后,未匹配到对应数据的键会自动保留初始的空字符串值,无需额外处理。
完整可运行代码
import requests # 实际使用时替换为你的接口请求逻辑 # resp = requests.get(url="你的接口地址", headers={"鉴权参数": "对应值"}) # resp_json = resp.json() # 以下为基于你提供的结构做的本地演示 resp_json = { "data": [ { "type": "Projects", "id": "102777c7-50a7-592d-1b65-621d5850a5bb", "attributes": { "name": "Hydroelectric Project Updated from Postman", "projectid": "001" }, "relationships": { "Accounts": "Account1", "Notes": "Note1" } }, { "type": "Projects", "id": "102c7131-d797-c085-d248-621d5820494f", "attributes": { "name": "Ana Hydroelectric Project", "projectid": "002" }, "relationships": { "Accounts": "Account1", "Notes": "Note1" } }, { "type": "Projects", "id": "1041f300-5acf-4bd9-2ec4-621d58bbe6bc", "attributes": { "name": "Methane Capture Project", "projectid": "003" }, "relationships": { "Accounts": "Account1", "Notes": "Note1" } } ] } # 初始字典键统一使用字符串类型 projectids = { "001": "", "002": "", "003": "", "004": "", } # 遍历匹配赋值,带字段缺失容错 for project in resp_json.get("data", []): current_pid = project.get("attributes", {}).get("projectid") current_top_id = project.get("id", "") if current_pid in projectids: projectids[current_pid] = current_top_id # 打印验证结果 print(projectids)
运行结果
代码执行后输出的结果完全符合预期:
{ "001": "102777c7-50a7-592d-1b65-621d5850a5bb", "002": "102c7131-d797-c085-d248-621d5820494f", "003": "1041f300-5acf-4bd9-2ec4-621d58bbe6bc", "004": "" }
额外说明
- 代码中所有字段取值都使用
.get()方法做了容错,即使接口返回的个别条目缺失attributes/projectid/id字段,也不会触发KeyError中断程序。 - 你提供的JSON示例中
relationships对象的两个键值对之间遗漏了逗号,这不符合标准JSON规范,实际接口返回的合法JSON会自动包含该分隔符,无需额外处理。 - 若后续需要新增待匹配的projectid,直接在初始
projectids字典中添加对应的字符串键和空字符串初始值即可,无需修改遍历逻辑。
内容的提问来源于stack exchange,提问作者Nirakar Nepal
相关产品推荐
相关产品推荐

