gr0*_*0bz 7 python json dictionary
我正在使用Python"请求"模块请求HTTP API.
result = requests.get(api_url)
Run Code Online (Sandbox Code Playgroud)
响应采用JSON格式,并包含一个"数据"键,它是一个字典.出于某些原因,我必须在脚本中进一步提出第二个请求,并且我正在尝试result.json['data']
使用第二个(result2.json['data']
)更新第一个字典().
我试过这个:
result.json['data'].update(result2.json['data'])
Run Code Online (Sandbox Code Playgroud)
还有这个:
for key,value in dict(result2.json['data']).iteritems():
result.json['data'][key] = value
Run Code Online (Sandbox Code Playgroud)
但这些都没有奏效,最终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'])
Run Code Online (Sandbox Code Playgroud)
(在旧requests
版本(1.0之前版本)中,属性result.json
是一个属性,在其下面仍然是一个动态返回对象的方法).
否则,Response
对象不应该是可变的.您必须更改响应正文文本以更改result.json
返回的内容,并且需要了解Response
对象如何缓存响应主体以更改它.这会将您绑定到特定requests
版本.
对于当前 requests
系列(2.4.x),您可以换出response._content
属性:
result.encoding, result._content = 'utf8', json.dumps(json_result)
Run Code Online (Sandbox Code Playgroud)
我已经假设result.content
已经存在(例如已经消耗了流响应),并且json_result
已经更新了.
如果这将在其他requests
版本中工作取决于; _content
是一个内部的私有属性.前导下划线表示它不是公共API的一部分,因此开发人员可以自由更改该属性的含义,或者在将来的版本中完全删除它.