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 相关文章推荐
TensorFlow的权值更新方法
Jun 14 Python
对Python的多进程锁的使用方法详解
Feb 18 Python
详解Python:面向对象编程
Apr 10 Python
python实现银联支付和支付宝支付接入
May 07 Python
Python使用统计函数绘制简单图形实例代码
May 15 Python
python 基于TCP协议的套接字编程详解
Jun 29 Python
django数据关系一对多、多对多模型、自关联的建立
Jul 24 Python
python 图像处理画一个正弦函数代码实例
Sep 10 Python
如何在python开发工具PyCharm中搭建QtPy环境(教程详解)
Feb 04 Python
Django数据结果集序列化并展示实现过程
Apr 22 Python
基于python3.7利用Motor来异步读写Mongodb提高效率(推荐)
Apr 29 Python
python如何设置静态变量
Sep 07 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分页示例代码
2007/03/19 PHP
需要使用php模板的朋友必看的很多个顶级PHP模板引擎比较分析
2008/05/26 PHP
JoshChen_web格式编码UTF8-无BOM的小细节分析
2013/08/16 PHP
Drupal简体中文语言包安装教程
2014/09/27 PHP
javascript replace()正则替换实现代码
2010/02/26 Javascript
推荐11款jQuery开发的复选框和单选框美化插件
2011/08/02 Javascript
jquery获取自定义属性(attr和prop)实例介绍
2013/04/21 Javascript
简单的js表单验证函数
2013/10/28 Javascript
Jquery 复选框取值兼容FF和IE8(测试有效)
2013/10/29 Javascript
javascript自定义函数参数传递为字符串格式
2014/07/29 Javascript
node.js中的favicon.ico请求问题处理
2014/12/15 Javascript
轻松创建nodejs服务器(10):处理POST请求
2014/12/18 NodeJs
JS自动倒计时30秒后按钮才可用(两种场景)
2015/08/31 Javascript
关于axios返回空对象的问题解决
2017/04/04 Javascript
JavaScript时间与时间戳的转换操作实例分析
2018/12/07 Javascript
京东优选小程序的实现代码示例
2020/02/25 Javascript
Python实现批量将word转html并将html内容发布至网站的方法
2015/07/14 Python
python如何实现远程控制电脑(结合微信)
2015/12/21 Python
Python进阶-函数默认参数(详解)
2017/05/18 Python
利用python编写一个图片主色转换的脚本
2017/12/07 Python
numpy中实现二维数组按照某列、某行排序的方法
2018/04/04 Python
python merge、concat合并数据集的实例讲解
2018/04/12 Python
Python列表解析配合if else的方法
2018/06/23 Python
python查找指定文件夹下所有文件并按修改时间倒序排列的方法
2018/10/21 Python
pygame游戏之旅 调用按钮实现游戏开始功能
2018/11/21 Python
使用Python的SymPy库解决数学运算问题的方法
2019/03/27 Python
自荐信如何“自荐”
2013/10/24 职场文书
简历里的自我评价
2014/01/31 职场文书
《恐龙》教学反思
2014/04/27 职场文书
中队活动总结
2014/08/27 职场文书
用人单位终止解除劳动合同证明书
2014/10/06 职场文书
刑事撤诉申请书
2015/05/18 职场文书
寒假致家长的一封信
2015/10/10 职场文书
品牌形象定位,全面分析
2019/07/23 职场文书
PHP新手指南
2021/04/01 PHP
Golang数据类型和相互转换
2022/04/12 Golang