前言

在做接口测试的时候,最常见的接口返回数据就是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中的单双引号的更多相关文章

  1. ASP.NET WEB API 返回JSON 出现2个双引号问题

    前言          在使用ASP.NET WEB API时,我想在某个方法返回JSON格式的数据,于是首先想到的就是手动构建JSON字符串,如:"{\"result\" ...

  2. python将字符串插入表中避免单双引号问题

    调用pymysql.escape_string('向数据库插入的数据') 例如: import pymysql str = 'as"sdf' print(pymysql.escape_str ...

  3. 【Spring学习笔记-MVC-3.1】SpringMVC返回Json数据-方式1-扩展

    <Spring学习笔记-MVC>系列文章,讲解返回json数据的文章共有3篇,分别为: [Spring学习笔记-MVC-3]SpringMVC返回Json数据-方式1:http://www ...

  4. guxh的python笔记二:函数基础

    1,函数的参数 1.1,查看函数的参数类型 def run(a, *args, b, **kwargs): return a + b 可以通过如下方式查看参数类型: import inspect k ...

  5. 用JS编写一个函数,返回数组中重复出现过的元素

    用JS编写一个函数,返回数组中重复出现过的元素,见下面的代码: , , , , , , , ]; var getRepeat = function (arr) { var obj = {}; , le ...

  6. python 单双引号交替的json串

    单双引号交替的json串 1.常见的json串,类似于这种{"isSucess":true, "name":"yoyo", "st ...

  7. json包含单双引号问题解决方案

    解决方案:在后台处理 JSONArray.fromObject(list).toString() 转自明明如月小角落: 效果DEMO: JsonQuotesUtil.js /** * 解决json传输 ...

  8. Java 处理json字符串value中多余的双引号

    转: Java 处理json字符串value中多余的双引号 一.错误场景 json字符串的value值中有多余的双引号 1.直接上错误的json字符串 1 String errorJsonStr =  ...

  9. Python 笔记(一)字典与json使用及注意点

    个人笔记系列,随便参考 1.python 中字典与json的差别 字典的生成 >>> a = dict(one=1, two=2, three=3) >>> b = ...

随机推荐

  1. Codeforces 445A Boredom(DP+单调队列优化)

    题目链接:http://codeforces.com/problemset/problem/455/A 题目大意:有n个数,每次可以选择删除一个值为x的数,然后值为x-1,x+1的数也都会被删除,你可 ...

  2. 父元素的mousedown事件上父元素的mousedown事件上的offsetX和offsetY错误的offsetX和offsetY错误

    https://stackoverflow.com/questions/35360704/wrong-offsetx-and-offsety-on-mousedown-event-of-parent- ...

  3. hdu 5875(单调栈)

    Function Time Limit: 7000/3500 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total ...

  4. linux下设置opencv环境变量

    一.安装opencv(这里不再讲述) 二.添加库路径(创建opencv.conf文件) 输入命令:vi /etc/ld.so.conf.d/opencv.conf 输入/usr/local/lib,并 ...

  5. EasyUi – 6.easyui常见问题

    1.进度条 2.JQuery EasyUI弹出对话框解决Asp.net服务器控件无法执行后台代码的方法 3. 三张表的连接查询现在到datagrid里 4.日期组合框DateBox设置readonly ...

  6. 【Mac】Chrome中添加截图扩展插件FireShot方法

    FireShot是一款可以使用谷歌浏览器快速捕捉当前网页中元素的chrome截图插件,在谷歌浏览器中安装FireShot插件以后可以对网页中整个屏幕或者是网页的部分视图进行截图操作,在截图之后用户还可 ...

  7. [转]SharePoint 2010 Powershell Feature Cmdlets

    In this installment its time to look at the various cmdlets that have to do with Features. Of course ...

  8. Android之 ListView(1)

    ListView是Android中最常用的控件之一. 当有太多数据需要显示的时候,ListView就派上用场了.它允许用户通过滑动手指的方式,将数据滑入滑出界面. 一.最简单的ListView实现 1 ...

  9. nyoj 18 The Triangle

    The Triangle 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 7 3 8 8 1 0 2 7 4 4 4 5 2 6 5 (Figure 1) Figure ...

  10. 「ZJOI2009」多米诺骨牌

    「ZJOI2009」多米诺骨牌 题目描述 有一个n × m 的矩形表格,其中有一些位置有障碍.现在要在这个表格内 放一些1 × 2 或者2 × 1 的多米诺骨牌,使得任何两个多米诺骨牌没有重叠部分,任 ...