Python 正确更新RESTAPI的json文件字段

Python 正确更新RESTAPI的json文件字段,python,json,rest,Python,Json,Rest,我正在使用python中的GET检索带有RESTAPI的json文件,并希望检索json文件,更新其中的一些值,然后更新该值。我的目标如下: r1 = requests.get(url) requests.put(url, json=r1) r1.json()['a']['a'] = 2 // print r1.json()['a']['a'] ->1 r1.json()['a']['b'] = 2 // print r1.json()['a']['b'] ->1 r1.jso

我正在使用python中的GET检索带有RESTAPI的json文件,并希望检索json文件,更新其中的一些值,然后更新该值。我的目标如下:

 r1 = requests.get(url)
requests.put(url, json=r1)
r1.json()['a']['a'] = 2 // print r1.json()['a']['a'] ->1
r1.json()['a']['b'] = 2 // print r1.json()['a']['b'] ->1
r1.json()['a']['c'] = 2 // print r1.json()['a']['c'] ->1
它返回整个json文件。现在我想更新json的一些值,并使用put REST API调用将其放回原处。我的put命令如下所示:

 r1 = requests.get(url)
requests.put(url, json=r1)
r1.json()['a']['a'] = 2 // print r1.json()['a']['a'] ->1
r1.json()['a']['b'] = 2 // print r1.json()['a']['b'] ->1
r1.json()['a']['c'] = 2 // print r1.json()['a']['c'] ->1
我要更新的字段如下所示:

 r1 = requests.get(url)
requests.put(url, json=r1)
r1.json()['a']['a'] = 2 // print r1.json()['a']['a'] ->1
r1.json()['a']['b'] = 2 // print r1.json()['a']['b'] ->1
r1.json()['a']['c'] = 2 // print r1.json()['a']['c'] ->1

我的问题是如何正确更新json的字段?

您应该将其保存为变量,修改后再发送回

my_json = r1.json()
my_json['a']['a'] = 2
my_json['a']['b'] = 2
my_json['a']['c'] = 2
requests.put(url, json=my_json)

基本上,您在代码中所做的是调用从响应生成字典的
.json()
,您并不是真正修改响应对象,而是真正修改从
.json()
调用返回的值的结果。

您应该将其保存为变量,修改它,然后将其发送回

my_json = r1.json()
my_json['a']['a'] = 2
my_json['a']['b'] = 2
my_json['a']['c'] = 2
requests.put(url, json=my_json)

基本上,您在代码中所做的是调用从响应生成字典的
.json()
,您并不是真正修改响应对象,而是真正修改
.json()
调用返回值的结果。

要改进bluesummer的答案,
response.json()
只是
json.load(response.content)
的快捷方式,每次调用它时都会创建一个新的dict。看看这个代码是什么:

r1.json()['a']['a'] = 2

  • r1.内容创建dict
  • 更新此命令
  • 最后扔掉它

这就是为什么要更新dict时必须保留对dict的引用(将其分配给变量)。

为了改进bluesummer的答案,
response.json()
只是
json.loads(response.content)
的快捷方式,每次调用它时都会创建一个新的dict。看看这个代码是什么:

r1.json()['a']['a'] = 2

  • r1.内容创建dict
  • 更新此命令
  • 最后扔掉它

这就是为什么要更新dict时必须保留对dict的引用(将其分配给变量)。

这就成功了。然而,我还有另一个任务。如果我只想更新json的值,而不想创建一个新的值,我应该执行put还是post?json文件已正确更改,但put不会更改我的服务器中的字段。通常,要更新某些资源put,请使用POST进行创建。但事实上,你可以使用POST制作任何东西,这取决于你的应用程序架构和偏好。->URL和HTTP方法之间的关系“它从响应中生成json”=>实际上它生成了一个
dict
-“json”不是一种数据类型,它是一种文本格式。@Brunodesshuilliers,你完全正确,我修正了这一点。然而,我还有另一个任务。如果我只想更新json的值,而不想创建一个新的值,我应该执行put还是post?json文件已正确更改,但put不会更改我的服务器中的字段。通常,要更新某些资源put,请使用POST进行创建。但事实上,你可以使用POST制作任何东西,这取决于你的应用程序架构和偏好。->URL和HTTP方法之间的关系“它从响应中生成json”=>实际上它生成了一个
dict
-“json”不是一种数据类型,它是一种文本格式。@Brunodesshuilliers,你完全正确,我修复了你从响应中调用json()的问题,你无法更改它。首先,您需要将r1.json保存到某个变量中,然后更改一些值并在requests中使用它。put.U从response调用json(),而您无法更改它。首先需要将r1.json保存到某个变量中,然后更改一些值并在requests.put中使用它。