Python 如何将字符串转为字典
1 通过json转换
>>> errors = str({"email": [{"message": "\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684 Email \u5730\u5740\u3002", "code": "invalid"}]})
>>> errors
"{'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]}"
>>> errors_dict = {"email": [{"message": "\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684 Email \u5730\u5740\u3002", "code": "invalid"}]}
>>> errors_dict
{'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]}
>>> import json
>>> errors_dic1 = json.loads(errors)
Traceback (most recent call last):
File "<pyshell#7>", line 1, in <module>
errors_dic1 = json.loads(errors)
File "E:\locate_app\develop\Python3\lib\json\__init__.py", line 354, in loads
return _default_decoder.decode(s)
File "E:\locate_app\develop\Python3\lib\json\decoder.py", line 339, in decode
obj, end = self.raw_decode(s, idx=_w(s, 0).end())
File "E:\locate_app\develop\Python3\lib\json\decoder.py", line 355, in raw_decode
obj, end = self.scan_once(s, idx)
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 2 (char 1)
但是使用 json
进行转换存在一个潜在的问题。
由于 json
语法规定 数组或对象之中的字符串必须使用双引号,不能使用单引号 (官网上有一段描述是 “A string is a sequence of zero or more Unicode characters, wrapped in double quotes, using backslash escapes” ),因此上面的转换是报错。
2 通过eval转换
>>> errors = str({"email": [{"message": "\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684 Email \u5730\u5740\u3002", "code": "invalid"}]})
>>> errors
"{'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]}"
>>> errors_dic2 = eval(errors)
>>> errors_dic2
{'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]}
>>> type(errors_dic2)
<class 'dict'>
通过 eval
进行转换就不存在上面使用 json
进行转换的问题。但是,使用 eval
却存在安全性的问题
,比如下面的例子
# 让用户输入 `user_info`
>>> user_info = raw_input('input user info: ')
# 输入 {"name" : "john", "gender" : "male", "age": 28},没问题
>>> user_dict = eval(user_info)
# 输入 __import__('os').system('dir'),user_dict 会列出当前的目录文件!
# 再输入一些删除命令,则可以把整个目录清空了!
>>> user_dict = eval(user_info)
ps:其实上面的安全性问题,我没看懂
3 通过literal_eval
>>> import ast
>>> errors = str({"email": [{"message": "\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684 Email \u5730\u5740\u3002", "code": "invalid"}]})
>>> errors
"{'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]}"
>>> type(errors)
<class 'str'>
>>> errors_dict = ast.literal_eval(errors)
>>> errors_dict
{'email': [{'message': '输入一个有效的 Email 地址。', 'code': 'invalid'}]}
>>> type(errors_dict)
<class 'dict'>
扩展:
Python eval()函数
python 内置函数
描述
eval()函数用来执行一个字符串表达式,并返回表达式的值
语法
eval(expression[,globals[,locals]])
参数
- expression – 表达式
- globals – 变量作用域,全局命名空间,如果被提供,则必须是一个字典对象
- locals – 变量作用域,局部命名空间,如果被提供,可以是任何映射对象
返回值
返回表达式计算结果
实例
>>> x = 7
>>> eval('3*x')
21
>>> eval('pow(2,2)')
4
>>> eval('2+2')
4
>>> n=81
>>> eval("n+4")
85