在Python中将字符串转换为JSON?

16

我正在尝试将一个由urllib3生成的字符串转换成其他格式。

Traceback (most recent call last):
  File "<pyshell#16>", line 1, in <module>
    data = json.load(data)
  File "C:\Python27\Lib\json\__init__.py", line 286, in load
    return loads(fp.read(),
AttributeError: 'str' object has no attribute 'read'

>>> import urllib3
>>> import json
>>> request = #urllib3.request(method, url, fields=parameters)
>>> data = request.data

现在...当我尝试以下操作时,会出现该错误...

>>> json.load(data) # generates the error
>>> json.load(request.read()) # generates the error

运行 type(data)type(data.read()) 都会返回 <type 'str'>

data = '{"subscriber":"0"}}\n'

2
您的 JSON 多了一个括号。这是有意为之吗? - Blender
你说的“将字符串转换为JSON”是什么意思?JSON本身就是一种字符串格式。你想要将JSON转换为适当的本地Python对象(在这种情况下是将一个字符串映射到另一个字符串的字典)吗?还是将某些非JSON字符串转换为JSON字符串,或者其他不同的操作? - abarnert
1
如果data是字符串,type(data.read())不应该起作用。 - Blender
事实上,type(data.read()) 肯定会引发与 json.load(data) 完全相同的异常。我想他的意思是 type(request.read()),它将成功地返回 str 类型。 - abarnert
额外的括号是输错了。对此很抱歉。data.read() 是输错了。 - bnlucas
可能是重复的问题:使用Python将字符串转换为JSON - Chillar Anand
1个回答

35

json.load从类文件对象中读取,您可能想使用json.loads

json.loads(data)

或者直接在请求上使用json.load,它是类似文件的对象:

json.load(request)

同时,如果您使用requests库,您可以直接执行以下操作:

import requests

json = requests.get(url).json()

或者,不要将json.load(request.read())转换为json.loads(request.read()),而是直接调用json.load(request) - abarnert
我正在使用requests库,尽管它目前被注释掉了。我正在开发Google Apps Engine,但它不允许我运行它,而且urlfetch在同一个GET请求上也存在问题。因此,他们支持原始的urllib3库,这就是我正在测试的。json.loads(request.data)可以工作,但json.load(request)则不行。感谢您的帮助。 - bnlucas
json = requests.get(url).json() did not work for me as well my original line of code pageContent = requests.get(url,verify=False).json() - Umesh Kaushik
限制:数据参数a必须小于等于1GB,否则将失败。 - MMEL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接