python - 修改一个 Python "requests"模块响应对象

标签 python json dictionary

我正在使用 Python“请求”模块请求 HTTP API。

result = requests.get(api_url)

响应采用 JSON 格式,并包含一个字典形式的“数据”键。 出于某些原因,我必须在脚本中进一步提出第二个请求,并且我正在尝试用第二个(result.json['data'])更新第一个字典(result2.json['data'])。

我试过这个:

result.json['data'].update(result2.json['data'])

还有这个:

for key,value in dict(result2.json['data']).iteritems():
    result.json['data'][key] = value

但这些都不起作用,最后的 result.json['data']未修改,仅包含前几项。

所以我想知道 Python“请求”模块是否生成了一些“只读”对象之王,或者我是否只是遗漏了一些东西。

最佳答案

result.json() 是一个方法(请求 1.0 及更高版本)或一个属性。将该方法或属性的结果存储在一个变量中,然后更新它:

json_result = result.json()
# requests < 1.0: json_result = result.json

json_result['data'].update(result2.json()['data'])

(在旧的 requests 版本(pre-1.0)中,result.json 是一个 property,在它下面仍然是一个方法返回你的对象在飞行中)。

否则,Response 对象不应该是可变的。您必须更改响应 正文 才能更改 result.json 返回的内容,并且需要深入了解 Response 对象的方式缓存响应主体以更改它。这会将您绑定(bind)到特定的 requests 版本。

对于 current requests 系列 (2.4.x),您可以换出 response._content 属性:

result.encoding, result._content = 'utf8', json.dumps(json_result)

我假设 result.content 已经存在(例如,流响应已经被消费),并且 json_result 已经更新。

这是否适用于其他 requests 版本取决于; _content 是内部私有(private)属性。前导下划线表示它不是公共(public) API 的一部分,因此开发人员可以自由更改该属性的含义或在未来的版本中将其完全删除。

关于python - 修改一个 Python "requests"模块响应对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26342180/

相关文章:

javascript - JSON 文字操作

python - 如何使类 JSON 可序列化以在 Django session 中使用

python - 将字典列表转换为列表列表

python - Pandas 数据框可对多列和要列出的值进行字典

c++ - 在 C++ 中映射两种对象类型

python - 如何在 Blender 中以编程方式创建逻辑 block ?

python - 将 Pandas 数据框行值汇总为平均值和总和

python - WXPython:填充列表框的问题

python - 如何从 lambda 函数 ssh 到 EC2 实例

java - 将 Bing JSON 转换为 Java