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 相关文章推荐
pycharm 使用心得(五)断点调试
Jun 06 Python
Python常见数据结构详解
Jul 24 Python
用Python登录Gmail并发送Gmail邮件的教程
Apr 17 Python
Python作用域用法实例详解
Mar 15 Python
python中lambda()的用法
Nov 16 Python
Python任意字符串转16, 32, 64进制的方法
Jun 12 Python
python版百度语音识别功能
Jul 09 Python
教你如何编写、保存与运行Python程序的方法
Jul 12 Python
基于 Django 的手机管理系统实现过程详解
Aug 16 Python
python3实现微型的web服务器
Sep 03 Python
Python ckeditor富文本编辑器代码实例解析
Jun 22 Python
详解anaconda安装步骤
Nov 23 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实现把MySQL数据库导出为.sql文件实例(仿PHPMyadmin导出功能)
2014/05/10 PHP
Opcache导致php-fpm崩溃nginx返回502
2015/03/02 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
微信公众号判断用户是否已关注php代码解析
2016/06/24 PHP
laravel如何开启跨域功能示例详解
2017/08/31 PHP
thinkphp框架表单数组实现图片批量上传功能示例
2020/04/04 PHP
js 遍历对象的属性的代码
2011/12/29 Javascript
javascript轻松实现当鼠标移开时已弹出子菜单自动消失
2013/12/29 Javascript
JavaScript实现的石头剪刀布游戏源码分享
2014/08/22 Javascript
javascript如何写热点图
2015/12/08 Javascript
基于JS实现新闻列表无缝向上滚动实例代码
2016/01/22 Javascript
基于JavaScript实现添加到购物车效果附源码下载
2016/08/22 Javascript
Vuejs第九篇之组件作用域及props数据传递实例详解
2016/09/05 Javascript
js仿iphone秒表功能 计算平均数
2017/01/11 Javascript
ng2学习笔记之bootstrap中的component使用教程
2017/03/09 Javascript
NodeJs测试框架Mocha的安装与使用
2017/03/28 NodeJs
详解vee-validate的使用个人小结
2017/06/07 Javascript
jquery处理checkbox(复选框)是否被选中实例代码
2017/06/12 jQuery
vue用递归组件写树形控件的实例代码
2018/07/19 Javascript
微信小程序实现获取小程序码和二维码java接口开发
2019/03/29 Javascript
VUE项目初建和常见问题总结
2019/09/12 Javascript
vue+node 实现视频在线播放的实例代码
2020/10/19 Javascript
JavaScript实现点击出现子菜单效果
2021/02/08 Javascript
[58:42]DOTA2上海特级锦标赛C组败者赛 Newbee VS Archon第一局
2016/02/27 DOTA
在Python中用split()方法分割字符串的使用介绍
2015/05/20 Python
Python判断列表是否已排序的各种方法及其性能分析
2016/06/20 Python
Python使用tkinter库实现文本显示用户输入功能示例
2018/05/30 Python
python中验证码连通域分割的方法详解
2018/06/04 Python
获取django框架orm query执行的sql语句实现方法分析
2019/06/20 Python
Python操作Mongodb数据库的方法小结
2019/09/10 Python
Pandas中DataFrame基本函数整理(小结)
2020/07/20 Python
关于python3.7安装matplotlib始终无法成功的问题的解决
2020/07/28 Python
Python使用paramiko连接远程服务器执行Shell命令的实现
2021/03/04 Python
世界领先的艺术图书出版社:TASCHEN
2018/07/23 全球购物
小学四年级作文之写景
2019/08/23 职场文书
详解MySQL InnoDB存储引擎的内存管理
2021/04/08 MySQL