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

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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值