python实现类jq的json路径过滤
开发过程中访问接口时经常用到jq来过滤json,用着觉得不是很爽,于是自己搞一个舒服的 _
先说需求:
输入:参数1:被过滤对象(json、dict、list), 参数2:过滤路径
输出:过滤结果(python对象),默认格式化输出结果,key按字母顺序排列
支持过滤方式:
dict key过滤 .key
dict key列表 .keys()
dict value列表 .values()
dict key,value对 .iterms()
list过滤 .3 或 .[3]
list负索引 .-2 或 .[-2]
list切片1 .2:6 或 .[2:6]
list切片2 .2: 或 .[2:]
list切片3 .:6 或 .[:6]
list step1 .1:6:2 或 .[1:6:2]
list step2 .1::2 或 .[1::2]
list step3 .::2 或 .[::2]
string过滤..与list相同
string切片..与list相同
string 切片 step..与list相同
废话不多说,直接上核心代码,兼容Py2和Py3
from __future__ import unicode_literals
import json
import six
def ppt(obj, path='.', with_print=True, normal_path_print=False):
base_string = str if six.PY3 else basestring
obj = json.loads(obj) if isinstance(obj, base_string) else obj
find_str, find_map = '', ['["%s"]', '[%s]', '%s', '.%s']
for im in path.split('.'):
if not im:
continue
if isinstance(obj, (list, tuple, base_string)):
if im.startswith('[') and im.endswith(']'):
im = im[1:-1]
if ':' in im:
slice_default = [0, len(obj), 1]
obj, quota = obj[slice(
*[int(sli) if sli else slice_default[i] for i, sli in
enumerate(im.split(':'))])], 1
else:
obj, quota = obj[int(im)], 1
else:
if im in obj:
obj, quota = obj[im], 0
elif im.endswith('()'):
obj, quota = list(getattr(obj, im[:-2])()), 3
else:
if im.isdigit():
obj, quota = obj[int(im)], 1
else:
raise KeyError(im)
find_str += find_map[quota] % im
if with_print:
print(obj if isinstance(obj, base_string) else
json.dumps(obj,
indent=4,
sort_keys=True,
ensure_ascii=False))
if normal_path_print:
print('get it normally with: <obj>%s' % find_str)
return obj
函数名:ppt,pretty print, 想不起更好的简短的命名了 ?_?
参数说明:
- obj 输入的对象
- path='.' 过滤字符串
- with_print=True 是否格式化打印输出过滤结果
- normal_path_print=False 是否输出过滤器反解后的正常查找方式
举例:
> test = '{"a": [1, 3, 4, 9, 10, 0, 5, 3, 7], "c": [{"h": 1, "d": [{"e": ["f", "g"]}]}], "b": "1234567890", "d": null}'
> ppt(test)
{
"a": [
1,
3,
4,
9,
10,
0,
5,
3,
7
],
"b": "1234567890",
"c": [
{
"d": [
{
"e": [
"f",
"g"
]
}
],
"h": 1
}
],
"d": null
}
上述输出key按字母顺序排序
> ppt(test, '.a.::2', normal_path_print=True)
[
1,
4,
10,
5,
7
]
get it normally with: <obj>["a"][::2]
> ppt(test, '.c.0.keys()', normal_path_print=True)
[
"h",
"d"
]
get it normally with: <obj>["c"][0].keys()
方便的地方:
如 一个复杂的引用数据的方式
['all_angles'][0]['nodes'][-1]['children'][1]['children'][3]['id']
换用更简单的方式,可以更简单快速的定位数据:
'all_angles.0.nodes.-1.children.1.children.3.id'
python实现类jq的json路径过滤的更多相关文章
- python字典转化成json格式。JSONEncoder和JSONDecoder两个类来实现Json字符串和dict类型数据的互相转换
遇到问题:进行Webservice接口测试时,对接口入参数据进行了处理,变成了dict格式,去进行接口请求报错. 需要转成成json格式,双引号去扩. 如下: 更改代码: # 在Python标准库的j ...
- jq处理JSON数据, jq Manual (development version)
jq 允许你直接在命令行下对 JSON 进行操作,包括分片.过滤.转换等等.让我们通过几个例子来说明 jq 的功能:一.输出格式化,漂亮的打印效果如果我们用文本编辑器打开 JSON,有时候可能看起来会 ...
- 【python接口自动化】- 使用json及jsonpath转换和提取数据
前言 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式.它可以让人们很容易的进行阅读和编写,同时也方便了机器进行解析和生成,适用于进行数据交互的场景,比如 ...
- Python导出Excel为Lua/Json/Xml实例教程(一):初识Python
Python导出Excel为Lua/Json/Xml实例教程(一):初识Python 相关链接: Python导出Excel为Lua/Json/Xml实例教程(一):初识Python Python导出 ...
- Python的模块引用和查找路径
模块间相互独立相互引用是任何一种编程语言的基础能力.对于“模块”这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译型的语言,比如C#中 ...
- Python引用模块和查找模块路径
模块间相互独立相互引用是任何一种编程语言的基础能力.对于"模块"这个词在各种编程语言中或许是不同的,但我们可以简单认为一个程序文件是一个模块,文件里包含了类或者方法的定义.对于编译 ...
- Python之数据序列化(json、pickle、shelve)
本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型,其中面向对象的编程语言还允许开发者自定义数据类型(如:自定义类),Py ...
- python 基础之pickle 与json 报错问题解决方案
Python 基础之pickle与json 有没有在搞pickle与json在进行数据储存的时候老是报错,这个有些让人烦恼,在之前有一篇介绍过它们的基本用法以及在使用过长中避免一些坑,但是今天在把对象 ...
- 【转】Python之数据序列化(json、pickle、shelve)
[转]Python之数据序列化(json.pickle.shelve) 本节内容 前言 json模块 pickle模块 shelve模块 总结 一.前言 1. 现实需求 每种编程语言都有各自的数据类型 ...
随机推荐
- Android4.0-4.4 加入支持状态栏显示耳机图标方法(支持带不带MIC的两种耳机自己主动识别)
效果如图: 一. 在frameworks/base/packages/SystemUI/res/values/strings.xml 里加入 <string name="headset ...
- SQL语句 insert into 语句的写法
方式1: INSERT INTO t1(field1,field2) VALUE('001','002'); 最好的做法明确插入的每一列,列于查错,而且漏列的几率会降低! 方式2: INSERT IN ...
- 调用接口http封装
public static String httpHandler(String URL,String xml){ try { URL url=new URL(URL); URLConnection c ...
- Intellij IDEA 安装和配置jrebel进行项目的热部署
Jrebel 先介绍一下jrebel,jrebel是可以热部署项目的一个工具,更改代码自动部署并不需要重启项目(在spring中的controller中,增加.修改方法都是可以进行热部署而不需要重启的 ...
- mybatis中#和$符号的区别(转)
mybatis做为一个轻量级ORM框架在许多项目中使用,因其简单的入门受到了广大开发者的热爱.在近期项目中再做一个相关的开发,碰到了#.$符号这样的问题,之前没怎么注意过,通过学习之后,有了点感悟,分 ...
- rwx读写执行对文件和目录的意义
文件 目录 r 查看 列出目录内容 w 修改 在目录内新建删除文件 x 执行 可以进入目录 对文件的删除权限是对文件所有目录的写权限 对目录-wx的权限,有写和执行权限,既可以在目录内创建删除文件,可 ...
- C++ 头文件系列(iostream)
1. 简介 这个头文件非常特殊,它只声明了8个常用流对象. 2. 8个对象 2.1 窄字符对象(char) extern istream cin extern ostream cout extern ...
- Python模块之pickle(列表,字典等复杂数据类型与二进制文件的转化)
1.pickle模块简介 The pickle module implements binary protocols for serializing and de-serializing a Pyth ...
- office------------word邮件合并(word2016版)
虽然本人是学计算机的,但是office技能很一般,最近工作中用到了邮件合并这一功能,记录下来与大家分享. 我用到的邮件合并就是word中定好模板,从excel中批量导入数据,现实生活中,在录取通知书打 ...
- openstack ocata版本简化安装
Network Time Protocol (NTP) Controller Node apt install chrony Edit the /etc/chrony/chrony.conf 添加如下 ...