python将字符串转换成json的方法小结


Posted in Python onJuly 09, 2019

最近在工作中遇到了一个小问题,如果要将字符串型的数据转换成dict类型,我第一时间就想到了使用json函数。但是里面出现了一些问题

1、通过json来转换:

In [1]: import json
In [2]: mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23T03:18:02Z"}'
In [3]: mes_to_dict = json.loads(mes)
In [4]: print type(mes_to_dict)
<type 'dict'>

以上的方式转换是没问题的,但是加入mes的格式为mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23T03:18:02Z"}'的时候使用json来转换的时候又会发生什么呢?

In [5]: import json

In [6]: mes = "{'InsId': 1, 'name': 'lege-error', 'CreationTime': '2019-04-24T03:18:02Z'}"

In [7]: mes_to_dict = json.loads(mes)
---------------------------------------------------------------------------
ValueError                Traceback (most recent call last)
<ipython-input-7-77264851f35b> in <module>()
----> 1 mes_to_dict = json.loads(mes)

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/__init__.pyc in loads(s, encoding, cls, object_hook, parse_float, parse_int, parse_constant, object_pairs_hook, **kw)
  336       parse_int is None and parse_float is None and
  337       parse_constant is None and object_pairs_hook is None and not kw):
--> 338     return _default_decoder.decode(s)
  339   if cls is None:
  340     cls = JSONDecoder

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.pyc in decode(self, s, _w)
  364
  365     """
--> 366     obj, end = self.raw_decode(s, idx=_w(s, 0).end())
  367     end = _w(s, end).end()
  368     if end != len(s):

/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/json/decoder.pyc in raw_decode(self, s, idx)
  380     """
  381     try:
--> 382       obj, end = self.scan_once(s, idx)
  383     except StopIteration:
  384       raise ValueError("No JSON object could be decoded")

ValueError: Expecting property name: 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” ),因此上面的转换是错误的:

通过eval来转换:

In [8]: mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23T03:18:02Z"}'

In [9]: mes_dict = eval(mes)

In [10]: print type(mes_dict)
<type 'dict'>

In [11]:

In [11]: mes = mes = "{'InsId': 1, 'name': 'lege-error', 'CreationTime': '2019-04-24T03:18:02Z'}"

In [12]: mes_dict = eval(mes)

In [13]: print type(mes_dict)
<type 'dict'>

上面的例子可以看出进行转换的时候不存在使用json转换的问题,但是我们需要注意的是使用eval会存在安全问题,比如:

串型的输入直接计算。比如,她会将'1+1'的计算串直接计算出结果。

In [14]: value = eval(raw_input('please input a value string:'))
please input a value string:2 + 2

In [15]: value
Out[15]: 4

从上面来看,eval功能可谓非常强大,即可以做string与list,tuple,dict之间的类型转换,还可以做计算器使用!更有甚者,可以对她能解析的字符串都做处理,而不顾忌可能带来的后果!所以说eval强大的背后,是巨大的安全隐患!!!

比如说用户恶意输入下面的字符串:

open(r'D://filename.txt', 'r').read()
__import__('os').system('dir')
__import__('os').system('rm -rf /etc/*')

那么eval就会显示你电脑目录结构,读取文件,删除文件等等。如果是格盘等更严重的操作,她也会照做不误!!! 显然这个不符合我们的需求!
通过literal_eval转换:

In [20]: import ast
In [21]: mes = '{"InsId": 2, "name": "lege-happy", "CreationTime": "2019-04-23T03:18:02Z"}'
In [22]: mes_dict = ast.literal_eval(mes)
In [23]: print type(mes_dict)
<type 'dict'>
In [24]:
In [24]:
In [24]: mes = mes = "{'InsId': 1, 'name': 'lege-error', 'CreationTime': '2019-04-24T03:18:02Z'}"
In [25]: mes_dict = ast.literal_eval(mes)
In [26]: print type(mes_dict)
<type 'dict'>

使用 ast.literal_eval 进行转换既不存在使用 json 进行转换的问题,也不存在使用 eval 进行转换的 安全性问题,因此推荐使用 ast.literal_eval。

我们来看看官方文档怎么描述literal_eval的:

def literal_eval(node_or_string):
  """
  Safely evaluate an expression node or a string containing a Python
  expression. The string or node provided may only consist of the following
  Python literal structures: strings, numbers, tuples, lists, dicts, booleans,
  and None.
  """

意思说ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。

比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval(),都会拒绝执行。

所以个人推荐大家转换dict的时候,出于安全考虑对字符串进行类型转换的时候,最好使用ast.literal_eval()函数!

总结

以上所述是小编给大家介绍的python将字符串转换成json的方法小结 ,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python实现应用程序在右键菜单中添加打开方式功能
Jan 09 Python
浅谈Python用QQ邮箱发送邮件时授权码的问题
Jan 29 Python
Python装饰器用法示例小结
Feb 11 Python
Django使用Celery异步任务队列的使用
Mar 13 Python
django进阶之cookie和session的使用示例
Aug 17 Python
selenium+python自动化测试之鼠标和键盘事件
Jan 23 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
Python 写了个新型冠状病毒疫情传播模拟程序
Feb 14 Python
Python开发之pip安装及使用方法详解
Feb 21 Python
python实现单机五子棋
Aug 28 Python
pandas实现导出数据的四种方式
Dec 13 Python
LeetCode189轮转数组python示例
Aug 05 Python
Python绘制堆叠柱状图的实例
Jul 09 #Python
python3 线性回归验证方法
Jul 09 #Python
python time.sleep()是睡眠线程还是进程
Jul 09 #Python
python logging模块的使用总结
Jul 09 #Python
Django中如何使用sass的方法步骤
Jul 09 #Python
python执行scp命令拷贝文件及文件夹到远程主机的目录方法
Jul 08 #Python
使用python socket分发大文件的实现方法
Jul 08 #Python
You might like
php+ajax+json 详解及实例代码
2016/12/12 PHP
Javascript 判断客户端浏览器类型代码
2010/03/01 Javascript
js禁止小键盘输入数字功能代码
2011/08/01 Javascript
JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
2012/01/08 Javascript
js给onclick事件赋值,动态传参数实例解说
2013/03/28 Javascript
cookie.js 加载顺序问题怎么才有效
2013/07/31 Javascript
js动态给table添加/删除tr的方法
2013/08/02 Javascript
让html页面不缓存js的实现方法
2014/10/31 Javascript
浅析jQuery Ajax请求参数和返回数据的处理
2016/02/24 Javascript
jquery datatable服务端分页
2016/08/31 Javascript
利用JavaScript在网页实现八数码启发式A*算法动画效果
2017/04/16 Javascript
Vue2.0权限树组件实现代码
2017/08/29 Javascript
移动前端图片压缩上传的实例
2017/12/06 Javascript
vue滚动固定顶部及修改样式的实例代码
2019/05/30 Javascript
python使用opencv读取图片的实例
2017/08/17 Python
Python实现购物车功能的方法分析
2017/11/10 Python
Python 编码规范(Google Python Style Guide)
2018/05/05 Python
python爬虫超时的处理的实例
2018/12/19 Python
Python3.5 Json与pickle实现数据序列化与反序列化操作示例
2019/04/29 Python
python线程定时器Timer实现原理解析
2019/11/30 Python
解决json中ensure_ascii=False的问题
2020/04/03 Python
Idea安装python显示无SDK问题解决方案
2020/08/12 Python
在PyCharm中安装PaddlePaddle的方法
2021/02/05 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
英格兰橄榄球商店:England Rugby Store
2016/12/17 全球购物
欧洲最大的化妆品连锁公司:Douglas道格拉斯
2017/05/06 全球购物
UGG美国官网:购买UGG雪地靴、拖鞋和鞋子
2017/12/31 全球购物
德国黑胶唱片、街头服装及运动鞋网上商店:HHV
2018/08/24 全球购物
Madda Fella官网:美国冒险家服装品牌
2020/01/16 全球购物
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
安全教育实施方案
2014/03/02 职场文书
高中校园广播稿3篇
2014/09/29 职场文书
党的群众路线教育实践活动方案
2014/10/31 职场文书
民事纠纷协议书
2016/03/23 职场文书
请学会珍惜眼前,因为人生没有下辈子!
2019/11/12 职场文书
MySQL命令无法输入中文问题的解决方式
2021/08/30 MySQL