在这种输入字符串上以json.loads
为最快的方式(执行明智):
istr=""" {u'topic': u'dl_job', u'url': u'http://somedomain.com' }"""
我无法控制传递的内容istr
。
注意:
u
'
而不是"
已更新:我知道我可以像替换u
和'
一样玩肮脏的技巧,但我想知道是否有更清洁的解决方案。
答案 0 :(得分:5)
如果这是一个Python数据结构(如图所示),那么你想要的函数是ast.literal_eval
。
http://docs.python.org/library/ast#ast.literal_eval
这类似于只调用eval
,但literal_eval是安全的,因为它不会调用任何函数或任何东西,只需解析文字(即列表,字符串,字符串,数字等)。
答案 1 :(得分:1)
如果您可以信任输入,则eval()似乎比天真替换快两倍。但是,所涉及的风险可能不值得获得性能提升。 (编辑:感谢J.F. Sebastian / Thomas K,补充literal_eval时间。)
from timeit import timeit
timeit(lambda: json.loads(istr.replace("'", "\"").replace("u\"", "\"")), number=10000)
0.69373106956481934
# UNSAFE
timeit(lambda: eval(istr), number=10000)
0.27783799171447754
# literal_eval accepts only strings, numbers, tuples, lists, dicts, booleans, and None
timeit(lambda: ast.literal_eval(istr.strip()), number=10000)
0.4245460033416748
(我假设在istr结尾处缺少的}是一个错字。)
答案 2 :(得分:0)
JSON是JSON。它具有构成有效JSON字符串的正式规范。 json.loads不从字符串加载python字典,它从字符串加载JSON。试图加载其他东西会让你陷入麻烦,是的,导致黑客攻击。
如果您想要评估python词典,我会建议Thomas K的评论,或者只是eval()。