JsonPath是一种简单的方法来提取给定JSON文档的部分内容。 JsonPath有许多编程语言,如Javascript,Python和PHP,Java。

JsonPath提供的json解析非常强大,它提供了类似正则表达式的语法,基本上可以满足所有你想要获得的json内容。

Json结构清晰,可读性高,复杂度低,非常容易匹配,其结合方式类似Xpath,为了方便记忆

下表中列出了对应了JSONPath以及对应的XPath用法。

XPath JSONPath 描述
/ $ 根节点
. @ 现行节点
/ .or[] 取子节点
.. n/a 取父节点,Jsonpath未支持
// .. 就是不管位置,选择所有符合条件的条件
* * 匹配所有元素节点
@ n/a 根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要属性访问。
[] [] 迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等)
\| [,] 支持迭代器中做多选。
[] ?() 支持过滤操作.
n/a () 支持表达式计算
() n/a 分组,JsonPath不支持

使用规则

JsonPath表达式可以使用点表示法

$.store.book [0].title

或括号表示法

$['store']['book'][0]['title']

前面我们提到了jsonpath目前支持多种语言,下面我们以Python为例子进行使用。

安装

pip install jsonpath

使用方法

import jsonpath
res=jsonpath.jsonpath(dic_name,'$..key_name')

嵌套n层也能取到所有key_name信息,其中:$表示最外层的{},..表示模糊匹配,当传入不存在的key_name时,程序会返回false.

XPath JSONPath 结果
/store/book/author $.store.book[*].author 商店里所有书籍的作者
//author $..author 所有作者
/store/* $.store.* 商店里的所有东西,都是一些书和一辆红色的自行车。
/store//price $.store..price 商店里一切的价格。
//book[3] $..book[2] 第三本书
//book[last()] $..book[(@.length-1)]或者$..book[-1:] 最后一本书。
//book[position()<3] $..book[0,1]或者$..book[:2] 前两本书
//book[isbn] $..book[?(@.isbn)] 使用isbn number过滤所有书籍
//book[price<10] $..book[?(@.price<10)] 过滤所有便宜10以上的书籍
//* $..* XML文档中的所有元素。JSON结构的所有成员。

综合案例

shop={
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
},
"expensive": 10
} import jsonpath
#商店里所有书籍的作者
author_list=jsonpath.jsonpath(shop,'$.store.book[*].author')
print(author_list) #['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien'] #返回所有的作者
author_list2=jsonpath.jsonpath(shop,'$..author')
print(author_list2) #['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J #商店里的所有东西
category_dx=jsonpath.jsonpath(shop,'$.store.*')
print(category_dx) #商店里一切的价格
store_price_list=jsonpath.jsonpath(shop,'$.store..price')
print(store_price_list) #[8.95, 12.99, 8.99, 22.99, 19.95] #第三本书
book_3=jsonpath.jsonpath(shop,'$..book[2]')
print(book_3) #最后一本书
num=len(jsonpath.jsonpath(shop,'$..book'))-1
book_last=jsonpath.jsonpath(shop,f'$..book[{num}]')
print(book_last) #前两本书
book_12=jsonpath.jsonpath(shop,f'$..book[0,1]')
print(book_12) #过滤所有便宜10以上的书籍
book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.price<10)]')
print(book_lg10) #使用isbn number过滤所有书籍
book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.isbn)]')
print(book_lg10)

参考资料

https://blog.csdn.net/xlengji/article/details/81023368

https://www.cnblogs.com/angle6-liu/p/10580792.html

解析复杂的嵌套数据结构-jsonpath的更多相关文章

  1. 使用 rlist 包处理嵌套数据结构

    在前面的章节中,我们已经学习了存储表的关系型数据库,支持嵌套数据结构的非关系型数据库.在 R 中,最常见的嵌套数据结构就是列表对象.之前的章节都关注操作表格数据.本节,我们一起玩转作者开发的 rlis ...

  2. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(2)

    上半部分内容链接 : https://www.cnblogs.com/lowmanisbusy/p/9069330.html 四.json和jsonpath的使用 JSON(JavaScript Ob ...

  3. python爬虫的页面数据解析和提取/xpath/bs4/jsonpath/正则(1)

    一.数据类型及解析方式 一般来讲对我们而言,需要抓取的是某个网站或者某个应用的内容,提取有用的价值.内容一般分为两部分,非结构化的数据 和 结构化的数据. 非结构化数据:先有数据,再有结构, 结构化数 ...

  4. jdk1.8源码解析:HashMap底层数据结构之链表转红黑树的具体时机

    本文从三个部分去探究HashMap的链表转红黑树的具体时机: 一.从HashMap中有关“链表转红黑树”阈值的声明: 二.[重点]解析HashMap.put(K key, V value)的源码: 三 ...

  5. 常用Python库整理

    记录工作和学习中遇到和使用过的Python库. Target 四个Level 整理 Collect 学习 Learn 练习 Practice 掌握 Master 1. Python原生和功能增强 1. ...

  6. [TcaplusDB知识库]数据库支撑底盘引擎计算层介绍

    在上次的TcaplusDB知识库中,TcaplusDB君为大家讲解了TcaplusDB所用的基于HASH表的Key-value存储引擎TXHDB.存储引擎作为数据库的支撑底盘,其重要性无可置疑,而在本 ...

  7. 数据结构图文解析之:直接插入排序及其优化(二分插入排序)解析及C++实现

    0. 数据结构图文解析系列 数据结构系列文章 数据结构图文解析之:数组.单链表.双链表介绍及C++模板实现 数据结构图文解析之:栈的简介及C++模板实现 数据结构图文解析之:队列详解与C++模板实现 ...

  8. Android利用Gson解析嵌套多层的Json

    参考:http://www.cnblogs.com/jxgxy/p/3677256.html 比如我们要解析一个下面这种的Json: String json = {"a":&quo ...

  9. java 中的JDK封装的数据结构和算法解析(集合类)----顺序表 List 之 ArrayList

    1. 数据结构之List (java:接口)[由于是分析原理,这里多用截图说明] List是集合类中的容器之一,其定义如下:(无序可重复) An ordered collection (also kn ...

随机推荐

  1. iOS - 数据存储方式(本地化)

    iOS中数据存储方式 一般使用以下4种:(已更新) .NSKeyedAchiever//序列化 存放对象 .NSUserDefaults//本质是plist存储 NSData.NSString.NSN ...

  2. BKP和RTC

    Stm32内部有多个BKP寄存器,在主电源被切断或者系统产生复位的时候,BKP寄存器仍然可以利用备用电源的支持保持其重要内容. BKP在实际应用中可以存入重要数据,防止被恶意查看. BKP有入侵检测, ...

  3. 修改Linux命令:ls为例

    Linux命令可以被修改,用于启动一些不起眼的程序. 操作方法如下: whereis ls cd /usr/bin mv ls ls_bak vim ls 新建的ls文件中 chmod +x ls c ...

  4. 关于MUI页面之间传值以及刷新的问题

    一.页面刷新问题 1.父页面A跳转到子页面B,B页面修改数据后再跳回A页面,刷新A页面数据 (1).父页面A代码 window.addEventListener("pageflowrefre ...

  5. 六、select查询基础篇

    前言: DQL(Data QueryLanguage):数据查询语言,通俗点讲就是从数据库获取数据的,按照DQL的语法给数据库发送一条指令,数据库将按需求返回数据. 一.基本语法 select 查询的 ...

  6. c# VS.NET 中的调试工具

  7. Python_比较运算符

    1.比较运算符

  8. 【动态规划】ZZNU-OJ- 2054 : 油田

    2054 : 油田 (一个神奇的功能:点击上方文字进入相应页面) 时间限制:1 Sec 内存限制:32 MiB提交:49 答案正确:6 提交 状态 讨论区 题目描述 在太平洋的一片海域,发现了大量的油 ...

  9. Git 的用法

    对于GIT  的用法,最近一直在寻找方法.网上也能找到一些方法.但是感觉说的不是很清楚,在这里我基于自己经验写一些. 对于任何一种方法都要安装GIT. 我是基于VS Code 2015 来做的. 在安 ...

  10. Android 测试-Robolectric,mockito,esspresso

    代码参考:https://github.com/googlesamples/android-testing 解释参考: https://www.jianshu.com/p/5732b4afd12f 官 ...