在工作中遇到一个小问题,需要将一个python的字符串转为字典,比如字符串:
user_info={"name":"john","gender":"male","age":28}我们想把它转为下面的字典:
user_dict={"name":"john","gender":"male","age":28}有以下几种方法:
1、通过json来转换
>>>importjson >>>user_info={"name":"john","gender":"male","age":28} >>>user_dict=json.loads(user_info) >>>user_dict {ugender:umale,uage:28,uname:ujohn}但是使用json进行转换存在一个潜在的问题。
由于json语法规定数组或对象之中的字符串必须使用双引号,不能使用单引号(官网上有一段描述是“AstringisasequenceofzeroormoreUnicodecharacters,wrappedindoublequotes,usingbackslashescapes”),因此下面的转换是错误的:
>>>importjson >>>user_info="{name:john,gender:male,age:28}" #由于字符串使用单引号,会导致运行出错 >>>user_dict=json.loads(user_info) Traceback(mostrecentcalllast): File"<stdin>",line1,in<module> File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.py",line339,inloads return_default_decoder.decode(s) File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py",line364,indecode obj,end=self.raw_decode(s,idx=_w(s,0).end()) File"/usr/local/Cellar/python/2.7.11/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.py",line380,inraw_decode obj,end=self.scan_once(s,idx) ValueError:Expectingpropertyname:line1column2(char1)2、通过eval
>>>user_info={"name":"john","gender":"male","age":28} >>>user_dict=eval(user_info) >>>user_dict {gender:male,age:28,name:john} >>>user_info="{name:john,gender:male,age:28}" >>>user_dict=eval(user_info) >>>user_dict {gender:male,age:28,name:john}通过eval进行转换就不存在上面使用json进行转换的问题。但是,使用eval却存在安全性的问题,比如下面的例子:
#让用户输入`user_info` >>>user_info=raw_input(inputuserinfo:) #输入{"name":"john","gender":"male","age":28},没问题 >>>user_dict=eval(user_info) #输入__import__(os).system(dir),user_dict会列出当前的目录文件! #再输入一些删除命令,则可以把整个目录清空了! >>>user_dict=eval(user_info)3、通过literal_eval
>>>importast >>>user={"name":"john","gender":"male","age":28} >>>user_dict=ast.literal_eval(user) >>>user_dict {gender:male,age:28,name:john} user_info="{name:john,gender:male,age:28}" >>>user_dict=ast.literal_eval(user) >>>user_dict {gender:male,age:28,name:john}使用ast.literal_eval进行转换既不存在使用json进行转换的问题,也不存在使用eval进行转换的安全性问题,因此推荐使用ast.literal_eval。
原文地址
参考资料
JSON python:singlevsdoublequotesinJSON-StackOverflow Usingpython’seval()vs.ast.literal_eval()?-StackOverflow JSON对象–JavaScript标准参考教程(alpha)本文内容总结:
原文链接:https://www.cnblogs.com/OnlyDreams/p/7850920.html