Python使用requests库反序列化JSON遇同名键问题求助
解决JSON中重复键的第一个值提取问题
我完全懂你遇到的麻烦——当JSON里存在多个同名键时,默认的json.loads()会直接用后面的键覆盖前面的,不仅拿不到第一个数据块的内容,还可能触发TypeError,确实挺闹心的。不过咱们可以通过修改JSON的解析方式来解决这个问题,而且只需要用Python标准库+requests就能搞定。
核心思路:保留所有键值对的顺序
Python的字典不允许重复键,这是默认解析会覆盖的根本原因。我们可以用json.loads()的object_pairs_hook参数,把JSON对象解析成键值对元组的列表,这样就能完整保留所有键的出现顺序,包括重复的那些。
具体实现代码
假设你的JSON结构是类似这样的(外层是包含多个数据块的数组,每个块都有title键):
[ { "title": "Diego Armando Maradona", "artist": "Some Artist" }, { "title": "Another Song", "artist": "Another Artist" } ]
对应的提取代码:
import requests import json # 1. 用requests获取JSON内容 response = requests.get("你的目标URL") response.raise_for_status() # 确保请求成功 # 2. 解析JSON时保留所有键值对的顺序 # object_pairs_hook=list会把每个JSON对象转成[(key1, value1), (key2, value2)...]的列表 parsed_json = json.loads(response.text, object_pairs_hook=list) # 3. 提取第一个数据块里的title first_data_block = parsed_json[0] # 取数组的第一个元素 target_title = None for key, value in first_data_block: if key == "title": target_title = value break # 找到第一个title就停止遍历 print(target_title) # 输出:Diego Armando Maradona
如果你的JSON是外层有重复的顶级键(比如多个data键),结构类似:
{ "data": { "title": "Diego Armando Maradona", "duration": "3:45" }, "data": { "title": "Other Song", "duration": "2:50" } }
那只需要调整遍历逻辑:
import requests import json response = requests.get("你的目标URL") response.raise_for_status() parsed_json = json.loads(response.text, object_pairs_hook=list) # 先找到第一个"data"键对应的内容 first_data_block = None for key, value in parsed_json: if key == "data": first_data_block = value break # 再从这个块里提取title if first_data_block: target_title = None for k, v in first_data_block: if k == "title": target_title = v break print(target_title)
为什么这个方法有效?
object_pairs_hook=list告诉JSON解析器,不要把对象转成字典,而是转成包含所有键值对元组的列表,这样就不会丢失重复的键,也能保留它们的出现顺序。- 遍历列表时,我们可以精准找到第一个出现的目标键,避免被后面的键覆盖。
内容的提问来源于stack exchange,提问作者MONS7ER
相关产品推荐
相关产品推荐

