ast.literal_eval会将unicode代码点从\ uxxxx转换为\\ uxxxx,如何避免?

时间:2015-04-20 01:38:51

标签: python json dictionary unicode

例如,以下是处理此json文件的代码

json.loads(u"\"{\\\"title\\\": \\\"\\\\u5927\\\"}\"")

json.loads 会将其转换为unicode字符串,见下文

{"title": "\u5927"}

这是处理unicode字符串的代码

ast.literal_eval(json.loads(u"\"{\\\"title\\\": \\\"\\\\u5927\\\"}\""))

ast.literal_eval 会将其转换为字典,见下文

{'title': '\\u5927'}

但我想要的是一本内容低于字典的字典

{'title': '\u5927'}

1 个答案:

答案 0 :(得分:0)

json.loads("{\"title\": \"\\u5927\"}")会返回字典,因此您根本不需要ast.literal_eval

d = json.loads("{\"title\": \"\\u5927\"}")

print d
{u'title': u'\u5927'}

type(d)
Out[2]: dict

对于完整的json.loads() json到python的转换,请参阅this

如果您正在尝试解析文件,请使用json.load()而不使用 s ,如下所示:

with open('your-file.json') as f:
    # you can change the encoding to the one you need
    print json.load(f, encoding='utf-8')

测试:

from io import StringIO

s = StringIO(u"{\"title\": \"\\u5927\"}")

print json.load(s)
{u'title': u'\u5927'}

更新

OP完全改变了应该解析json的内容,这是另一个解决方案,再次解析json:

json.loads(json.loads(u"\"{\\\"title\\\": \\\"\\\\u5927\\\"}\""))
Out[6]: {u'title': u'\u5927'}

这是因为第一个json.loads将字符串(非json)转换为json字符串,再次使用json.loads解析它将最终反序列化它。