您的位置:首页 > 编程语言 > Python开发

2018-07-22-14-Python如何将字符串转为字典

2019-03-24 00:06 435 查看

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: