json和dict

python中并没有json类型这一说法,通过json.dumps()转换字典对象,最后得到的是一个字符串对象,也就是说,在python中json格式的数据实际上就是一个字符串,但是通过str(dict)所得到的结果同json.dumps(dict)方法所得到的结果是不相同的

image.png

从上面的结果,可以看出来,str(dict)和json.dumps(dict)的区别在于引号的不同,json串使用双引号。所以相应的,使用json.loads(dict)时,所有的字符串对象必须是双引号

post请求中json和data

post请求中,可以使用data传递参数,也可以使用json传递参数,那么这两种方式有什么区别呢?

image.png

如果参数为JSON数据,可以直接传入json参数,它将自动编码并将Content-Type的置为application/json

  1. >>> payload = {'key1': 'value1', 'key2': 'value2'}
  2. >>> r = requests.post("https://httpbin.org/post", json=payload)
  3. >>> print(r.text)

如果data传递的参数为字符串,例如【json.dumps(payload)】,则request对参数进行url编码,Content-Type的值为None,所以data传字符串时,一定要在header中指定Content-Type

  1. payload = {'key1': 'value1', 'key2': 'value2'}
  2. headers={"Content-Type": "application/json"}
  3. r = requests.post("https://httpbin.org/post", headers=headers,data=json.dumps(payload))
  4. print(r.text)

如果data传递的是字典、元组组成的列表或列表作为值的字典,则request对参数进行url编码,Content-Type的值为application/x-www-form-urlencoded

  1. # 字典
  2. payload1 = {'key1': 'value1', 'key2': 'value2'}
  3. r = requests.post("https://httpbin.org/post", data=payload1)
  4. # 元组组成的列表
  5. payload2 = [('key1', 'value1'), ('key1', 'value2')]
  6. r = requests.post("https://httpbin.org/post", data=payload2)
  7. # 列表作为值的字典
  8. payload3 = {'key1': ['value1', 'value2']}
  9. r = requests.post("https://httpbin.org/post", data=payload3)