我知道这个问题听起来很重复,但事实并非如此,至少找了一段时间,我无法解决我的具体问题。
我有以下字符串:
"{first : {name : 'test', value : 100}, second : {name : 'test2', value : 50}}"
我想将该字符串转换为类似这样的字典:
{'first': {'name': 'test', 'value' : 100}, 'second': {'name': 'test2', 'value' : 50}}
有什么想法吗?我正在使用 Python 2.5
谢谢
请您参考如下方法:
首先,如果您要从字典(使用 Python 或几乎任何其他语言)生成这些字符串,您可能需要考虑以易于解析的方式生成它们。例如,在 Python 中。 repr(d) 或 json.dumps(d) 将为您提供与现有字符串非常相似的内容,但带有正确的引号。
但是如果你只是得到别人给你的一堆字符串,最简单的方法可能是将其正则表达式转换为实际的 JSON 字符串,以便你可以解析它:
json.loads(re.sub(r",\s*(\w+)", r", '\1'",
re.sub(r"\s*\{\s*(\w+)", r"{'\1'", x)).replace("'", '"'))
在 2.5 中,没有内置的 json 模块,所以你可能想要 pip install simplejson 然后你可以这样做:
try:
import json
except ImportError:
import simplejson as json
(或者,当然,如果您愿意,您可以无条件地要求 simplejson。)
另一种替代方法是使用 ast.literal_eval 而不是 json.loads。哪一个合适取决于有关您的字符串的更多信息。 JSON 比 Python 语法更受限制,因此如果您担心输入的来源,它会更安全,但如果您的输入可能合法地包含 JSON 无法处理的内容,例如 1+3j。
但是,与 json 一样,ast 是 2.6 的新功能,并且 PyPI 上没有可用的替代品。幸运的是,2.5 确实有 _ast 模块,您只需复制并粘贴 2.6 的 ast.py 中的源 ,但这有点麻烦。 ActiveState 也有食谱,比如 http://code.activestate.com/recipes/364469/这虽然与 literal_eval literal_eval 不同,但可能适合您的目的。
这仍然无法正常工作,因为您还缺少示例字符串中的右右大括号。我希望那是一个打字错误,这样就没有问题了。
如果不是,您需要解释您希望它在此类情况下实际执行的操作。也许自动关闭任何未关闭的括号?如果是这样,未闭合的括号也会成为问题吗?
