将字符串字典转换为普通字典

5

我有一个字符串,看起来像这样的字典:

{"h":"hello"}

我希望按照这里的指示将其转换为实际字典。

>>> import json
>>> 
>>> s = "{'h':'hello'}"
>>> json.load(s)

然而,我收到了一个错误:

Traceback (most recent call last): File "", line 1, in File "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/init.py", line 286, in load return loads(fp.read(),

AttributeError: 'str' object has no attribute 'read'

我的代码有什么问题,如何将类似字典的字符串转换为实际的字典?谢谢。


json.load 用于文件,但那不是有效的 json 格式,所以 json.loads 无法工作。 - jamylak
对于投票将其关闭为错别字的人:这不是离题的错别字,因为它是有效的Python代码,只是不是有效的JSON。 - jamylak
4个回答

6
您需要使用loads而不是load:
json.loads(s)

loads函数需要输入一个字符串,而load函数需要一个可读对象(通常是文件)作为输入。

此外,JSON使用双引号'"'来引用内容。

s = '{"a": 1, "b": 2}'

Here you have a live example


非常感谢,它正常工作了 :) - Houy Narun
这是不应该被接受的,因为输入字符串使用的是单引号而不是双引号。使用ast.literal_eval()的答案是正确的。 - Barmar
@Barmar,但我认为我们需要考虑到原始问题中要使用json.引号错误也在答案中解释了 :) - Netwave
除非他们对源数据有控制权,否则他们所“想要”的是无关紧要的。他们只能接受他们得到的东西。 - Barmar

3
我建议使用ast.literal_eval来实现这个功能:
import ast

ast.literal_eval('{"h":"hello"}')  # {'h': 'hello'}

查看这个解释可以了解为什么应该使用ast.literal_eval而不是eval


1
>>> import ast
>>> s = "{'h':'hello'}"
>>> ast.literal_eval(s)
{'h': 'hello'}

0
< p > eval 函数允许您运行代码并使用结果。通常用于将字符串解释为代码。

string = '{"a": 1, "b": 2}'
dct = eval(string)

了解更多关于eval的信息,请参考W3school对eval()的解释

免责声明:如果您正在为广泛的用户群体构建网站,请在使用eval之前了解eval的代码注入风险。


1
如果您查看重复的问题:https://dev59.com/OnNA5IYBdhLWcg3wX8rk#988251 它指出不要使用 eval - jamylak

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