json.loads格式输入字符串错误

时间:2012-02-24 12:46:14

标签: python json

在这种输入字符串上以json.loads为最快的方式(执行明智):

istr=""" {u'topic': u'dl_job', u'url': u'http://somedomain.com' }"""

我无法控制传递的内容istr

注意:

  • json.loads不喜欢领先u
  • 也不喜欢'而不是"
  • 分隔的字符串

已更新:我知道我可以像替换u'一样玩肮脏的技巧,但我想知道是否有更清洁的解决方案。

3 个答案:

答案 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()。