python笔记22-literal_eval函数处理返回json中的单双引号
前言
在做接口测试的时候,最常见的接口返回数据就是json类型,json类型数据实际上就是字串,通常标准的json格式是可以转化成python里面的对应的数据类型的
有时候开发返回的数据比较坑,不按常理出牌,如下这种,result对应的是一个list数据,却又加了单引号变成了一个字符串
严格意义来讲,json串里面应该都是双引号,这种单双交替的就尴尬了
{"isSucess":true, "result": '[{"name":"yoyo", "status": "200"}]'}
eavl
1.eval函数实现的功能
- 将字符串string对象转化为有效的表达式参
- 求值运算返回计算结果
2.语法:eval(expression,globals=None, locals=None)返回的是计算结果
- expression是一个参与计算的python表达式
- globals是可选的参数,如果设置属性不为None的话,就必须是dictionary对象了
- locals也是一个可选的对象,如果设置属性不为None的话,可以是任何map对象了
求值运算
1.eval() 函数用来执行一个字符串表达式,并返回表达式的值。
a = "hello"
b = "world"
# 把字符串里面内容,当成运算
c = eval("a+b")
print(c) # 返回结果 helloworld
d = eval("2+3+7*2")
print(d) # 返回结果 19
e = 20
print(eval("e+2")) # 返回结果 22
str转list、tuple、dict
# str转list
a = '[1, "a", None, True, [1, 2]]'
print(eval(a))
print(type(eval(a)))
# str转tuplue
b = '(1, "a", None, True, [1, 2])'
print(eval(b))
print(type(eval(b)))
# str转dict
c = '{"a": 1, "b": True, "c": None, "d": [1, 2], "e": {"a": 1}}'
print(eval(c))
print(type(eval(c)))
运行结果:
[1, 'a', None, True, [1, 2]]
<class 'list'>
(1, 'a', None, True, [1, 2])
<class 'tuple'>
{'a': 1, 'b': True, 'c': None, 'd': [1, 2], 'e': {'a': 1}}
<class 'dict'>
单双引号交替的json串
1.常见的json串,类似于这种{"isSucess":true, "name":"yoyo", "status": "200"},里面的key和value都是双引号。这种是可以用json模块里面的loads转成字典的
import json
a = '{"isSucess":true, "name":"yoyo", "status": "200"}'
b = json.loads(a)
print(b)
print(type(b))
运行结果
{'isSucess': True, 'name': 'yoyo', 'status': '200'}
<class 'dict'>
2.有时候返回的json数据并不是标准的双引号,里面key和value有单引号也有双引号,这种就比较坑了
{"isSucess":true, "result": '[{"name":"yoyo", "status": "200"}]'}
import json
c = '''{"isSucess":true, "result": '[{"name":"yoyo", "status": "200"}]'}'''
d = json.loads(c)
print(d)
直接这样用json去转,会报错:json.decoder.JSONDecodeError: Expecting value: line 1 column 29 (char 28)
3.解决办法
- 先替换json串里面的true, false, null这种类型
f = '''{"isSucess":true, "result": '[{"name":"yoyo", "status": "200"}]'}'''
f1 = f.replace("true", "True").replace("false", "False").replace("null", "None")
print(eval(f1))
运行结果:
{'isSucess': 'True', 'result': '[{"name":"yoyo", "status": "200"}]'}
eval安全隐患
1.eval的功能通俗一点讲就是把一个字符串理解成代码去执行,如果用户输入一段恶意代码,那就有安全隐患了,
比如导入os模块后执行cmd指令,这样就能对你的电脑为所欲为了,把你的重要文件删除就尴尬了
导入os可以用__import__('os')去导入
# coding:utf-8
# __import__('os').system('whoami')
a = input("输入:")
eval(a)
# __import__('os').system('dir')
b = input("请输入:")
eval(b)

2.解决安全隐患,使用literal_eval方法。需先导入ast
import ast
f = '''{"isSucess":true, "result": '[{"name":"yoyo", "status": "200"}]'}'''
f1 = f.replace("true", "True").replace("false", "False").replace("null", "None")
print(ast.literal_eval(f1))
print(eval(f1))
python自动化交流 QQ群:779429633
python笔记22-literal_eval函数处理返回json中的单双引号的更多相关文章
- ASP.NET WEB API 返回JSON 出现2个双引号问题
前言 在使用ASP.NET WEB API时,我想在某个方法返回JSON格式的数据,于是首先想到的就是手动构建JSON字符串,如:"{\"result\" ...
- python将字符串插入表中避免单双引号问题
调用pymysql.escape_string('向数据库插入的数据') 例如: import pymysql str = 'as"sdf' print(pymysql.escape_str ...
- 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展
<Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...
- guxh的python笔记二:函数基础
1,函数的参数 1.1,查看函数的参数类型 def run(a, *args, b, **kwargs): return a + b 可以通过如下方式查看参数类型: import inspect k ...
- 用JS编写一个函数,返回数组中重复出现过的元素
用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: , , , , , , , ]; var getRepeat = function (arr) { var obj = {}; , le ...
- python 单双引号交替的json串
单双引号交替的json串 1.常见的json串,类似于这种{"isSucess":true, "name":"yoyo", "st ...
- json包含单双引号问题解决方案
解决方案:在后台处理 JSONArray.fromObject(list).toString() 转自明明如月小角落: 效果DEMO: JsonQuotesUtil.js /** * 解决json传输 ...
- Java 处理json字符串value中多余的双引号
转: Java 处理json字符串value中多余的双引号 一.错误场景 json字符串的value值中有多余的双引号 1.直接上错误的json字符串 1 String errorJsonStr = ...
- Python 笔记(一)字典与json使用及注意点
个人笔记系列,随便参考 1.python 中字典与json的差别 字典的生成 >>> a = dict(one=1, two=2, three=3) >>> b = ...
随机推荐
- (二) Mysql 数据类型简介
第一节:整数类型.浮点数类型和定点数类型 1,整数类型 2,浮点数类型和定点数类型 M 表示:数据的总长度(不包括小数点): D 表示:小数位: 例如 decimal(5,2) 123.45 ...
- 用递归法计算从n个人中选选k个人组成一个委员会的不同组合数
用递归法计算从n个人中选选k个人组成一个委员会的不同组合数. 分析 由n个人里选k个人的组合数= 由n-1个人里选k个人的组合数+由n-1个人里选k-1个人的组合数: 当n = k或k = 0时,组合 ...
- day4 递归二分法查找
现有一个序列,data=[for i in range(1,5000,3)],现在要求看一个数是否在列表中存在,我们知道,我们可以使用in或__contains__()的方法,判断一个值是否在列表中, ...
- Python中列表的各种方法
列表是Python中一种常用的存储信息的方式,所以要熟练掌握列表的各种方法: 首先我们定义一个列表(name),然后练习里面的各种方法: >>> name = ["Sora ...
- Linux下rsync的用法
一.rsync的概述 rsync是类unix系统下的数据镜像备份工具,从软件的命名上就可以看出来了——remote sync.rsync是Linux系统下的文件同步和数据传输工具,它采用“rsync” ...
- Linux的权限对于文件与目录的意义
权限对文件: r:可读取此文件的实际内容. w:可以编辑.新增或者是修改该文件的内容(但不含删除该文件),如果没有r权限,无法w. x :该文件具有被系统执行的权限.可以删除. 权限对目录: r:re ...
- LeetCode 628. 三个数的最大乘积
题目描述 LeetCode 628. 三个数的最大乘积 给定一个整型数组,在数组中找出由三个数组成的最大乘积,并输出这个乘积. 示例1 输入: [1,2,3] 输出: 6 示例2 输入: [1,2,3 ...
- Python爬虫笔记(一)
个人笔记,仅适合个人使用(大部分摘抄自python修行路) 1.爬虫Response的内容 便是所要获取的页面内容,类型可能是HTML,Json(json数据处理链接)字符串,二进制数据(图片或者视频 ...
- cogs——2478. [HZOI 2016]简单的最近公共祖先
2478. [HZOI 2016]简单的最近公共祖先 ★☆ 输入文件:easy_LCA.in 输出文件:easy_LCA.out 简单对比时间限制:2 s 内存限制:128 MB [题 ...
- Tornado(一)
Tornado 特点 Tornado是一个用Python写的相对简单的.不设障碍的Web服务器架构,用以处理上万的同时的连接口,让实时的Web服务通畅起来.虽然跟现在的一些用Python写的Web架构 ...