我从带有请求的API中获取了一些数据:
r = requests.get(...)
a = r.text
print(type(a))
str2JSON = json.dumps(a,indent=4)
print(type(str2JSON))
结果是:
class 'str'
class 'str'
然后我尝试使用loads
而不是dumps
:
str2JSON_2 = json.loads(a)
print(type(str2JSON_2))
然后我上了list
类!
为什么是这种行为?
如果您将字符串转储到JSON中却没有收到错误,这是否自动表示JSON已被正确解析?那不应该是JSON类吗?
答案 0 :(得分:4)
从请求中得到的结果是一个str
值,其中包含JSON编码值。
dumps
接受str
并生成另一个字符串,其中包含原始(JSON编码)字符串的JSON编码版本。
您需要loads
才能将字符串解码为一个值。
json2str = json.loads(a,indent=4) # name change to reflect the direction of the operation
考虑:
>>> s = '"foo"' # A JSON string value
>>> json.dumps(s)
'"\\"foo\\""'
>>> json.loads(s)
'foo'
该字符串当然可以编码一个简单字符串以外的值:
>>> json.loads('3') # Compare to json.loads('"3"') returning '3'
3
>>> json.loads('[1,2,3]')
[1,2,3]
>>> json.loads('{"foo": 6}')
{'foo': 6}
但是, requests
实际上并不需要您记住dumps
和loads
的前进方向(尽管您应该把它作为学习的重点)。 Response
对象具有一种json
方法,可为您解码text
属性。
json2str = r.json() # equivalent to json2str = json.loads(r.text)
答案 1 :(得分:1)
您正在使用请求。它提供a = r.json()
所需的convince method to parse your response as json(即为您加载)。这样a
将成为JSON对象,以后可以将其作为字符串转储。假设您获得有效的json作为响应。
这是一个例子
import requests
import json
url = 'https://reqres.in/api/users' # dummy resposnse
resp = requests.get(url)
my_json = resp.json()
#print example user
print(my_json['data'][0])
json_string = json.dumps(my_json, indent=4)
print(json_string)
答案 2 :(得分:0)
json.dumps
返回JSON格式的python字符串对象。
下面是您可以在def dumps
的实际实现文件中注意到的语句
“”“将
obj
序列化为JSON格式的str
。