python如何将字符串转换成json的几种办法

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

1、通过json来转换:Python学习交流群:1004391443

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 and337             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)364365         """
--> 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 Pythonexpression.  The string or node provided may only consist of the followingPython literal structures: strings, numbers, tuples, lists, dicts, booleans,and None."""
  • 意思说ast模块就是帮助Python应用来处理抽象的语法解析的。而该模块下的literal_eval()函数:则会判断需要计算的内容计算后是不是合法的python类型,如果是则进行运算,否则就不进行运算。
  • 比如说上面的计算操作,及危险操作,如果换成了ast.literal_eval(),都会拒绝执行。

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

python如何将字符串转换成json的几种办法!相关推荐

  1. js中将字符串转换成json的三种方式

    ECMA-262(E3) 中没有将JSON概念写到标准中,还好在 ECMA-262(E5) 中JSON的概念被正式引入了,包括全局的JSON对象和Date的toJSON方法. 1,eval方式解析,恐 ...

  2. 字符串转换成json的三种方式

    使用ajax的开发项目过程中,经常需要将json格式的字符串返回到前端,前端解析成js对象(JSON ). ECMA-262(E3) 中没有将JSON概念写到标准中,还好在 ECMA-262(E5)  ...

  3. java 把map转换成json_map转换成JSON的3种方法

    1 json-lib net.sf.json-lib json-lib 2.4 jdk15 import java.util.HashMap; import java.util.Map; import ...

  4. python转json的函数_python将字符串转换成json的方法小结

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

  5. Jquery 将后台返回的字符串转换成Json格式的数据

    //code by:博客园-曹永思 第一步:将DataTable转换成 Json格式的数据 方法 一 View Code /// <summary>/// DataTable转成Json格 ...

  6. json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值...

    json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值 原文:json字符串转换成json对象,json对象转换成字符串,值转换成字符串,字符串转成值 主要内容: 一 ...

  7. json字符串转换成json对象

    Json字符与Json对象的相互转换方式有很多,接下来将为大家一一介绍下,感兴趣的朋友可以参考下哈,希望可以帮助到你 1>jQuery插件支持的转换方式: 代码如下: $.parseJSON( ...

  8. 字符串转换成JSON

    JS的字符串转换成JSON对象 好吧实际讲的是cookie字符串转换成json,原理都一样 要实现这一功能,首先,JS的字符串比如是这样的,querystring字符串.也就是有规律的吧,我在做xss ...

  9. badatatable转成json_C# DataTable 转换成JSON数据 三种方法

    在web开发中,我们可能会有这样的需求,为了便于前台的JS的处理,我们需要将查询出的数据源格式比如:List.DataTable转换为Json格式.特别在使用Extjs框架的时候,Ajax异步请求的数 ...

最新文章

  1. IOS上传代码到CocoaPods并通过Pod下载
  2. C#中float怎样保留两位小数?
  3. 深入jvm虚拟机第4版_深入理解JVM虚拟机
  4. 拿起电话就开始给(飞鸽传书3.0)
  5. atoi函数_C语言字符串、数字转换函数大全!
  6. 数据传输优化篇之:scp 或 rsync+ssh 参数优化
  7. 【antlr】antlr语法中的fragment
  8. python介绍环境搭建、变量输入输出
  9. 水很深的深度学习-Task02机器学习基础
  10. 分层结构的生活例子_AI的分层强化学习与人脑神经机制的联系
  11. word文档封面免费下载_为Word 2007文档添加封面
  12. 关于Java的图标和由来
  13. 【自己动手设计一个简单的加密算法Python】
  14. ios 绕过 id 锁
  15. 直播程序源码Android10.0 导航栏和状态栏动态控制合集
  16. 关于 安装Qt5.15.2启动QtCreator后“应用程序无法正常启动0xc0000022” 的解决方法
  17. strstr函数的原理原来是这样的
  18. 数据库设计报告——用教材管理系统来举例
  19. 爱因斯坦、牛顿、图灵用了都说好的神器——Typora Mathpix Snip加强版“食用”指南
  20. 合肥学院计算机考研资料汇总

热门文章

  1. 校园表白墙、微信表白墙、校园墙 微信小程序 JAVA 开发记录与分享
  2. Hello CSDN!
  3. 怎样在M1 Mac上运行iOS应用?
  4. ss570122的雕刻机制作过程
  5. MES系统的十大功能模块?本文讲的非常详细了
  6. 知名技术社区连续三天遭 DDos 攻击,高达 20 万次/秒请求
  7. catia二次开发:函数是否需要加括号 ,type类型 ,出现未定义变量类型错误,怎么破, 背景色设置 ,检查模块是否封闭 ,几何图形集是否存在某一个元素
  8. Mysql之mysqldump工具
  9. 美团扫码付小程序的优化实践
  10. 基于dileber的android网络图片播放器