文章目录

  • 1 JSON基础知识
    • 1.1 什么是JSON
    • 1.2 JSON数据格式
    • 1.3 JSON的优缺点
  • 2 什么是jsonpath
  • 3 拓展
  • 4 jsonpath解析json数据
    • 4.1 安装jsonpath
    • 4.2 xpath与jsonpath语法对比
    • 4.3 示例

1 JSON基础知识

1.1 什么是JSON

JSON全称JavaScript Object Notation(JS对象标记),是一种轻量级的数据交换格式。它相对于XML更小,更易于人阅读和编写,同时也易于机器解释和生存,并有效地提高网络传输效率。

1.2 JSON数据格式

JSON数据的书写格式是:key:value 键/值对。比如:“Name”: “May”
JSON值可以是:

JSON值类型 举例
数字(整数或浮点数) “status_code”: 200
字符串(在双引号中) “Name”: “Json”
逻辑值(true或false) “result”: true
数组(在方括号中) “user”: [“Linda”, “David”, “John”]
对象(在花括号中) “datas”: {“firstName”: “John”, “lastName”:“Doe”}
null “response”: null

1.3 JSON的优缺点

  • 优点
    数据体积小,轻量级的数据交换
    程序员编写更加容易
    相对于XML,JSON不需要考虑子父节点,更易于机器的解析和生成
    JSON支持多种编程语言:Java, JavaScript, PHP, Python, C, C#等

  • 缺点
    语法上过于严谨
    代码对数据的描述性差
    代码不易读

2 什么是jsonpath

jsonpath为json文档提供了解析能力,通过使用jsonpath,你可以方便的查找节点、获取想要的数据,jsonpath是json版的xpath,正如xpath之于XML文档一样。

3 拓展

  • python处理json格式所使用的函数

    函数 说明
    json.dumps() 将字典或者列表转换为json格式的字符串
    json.loads() 将json格式字符串转换为python对象
    json.dump() 将字典或者列表转换为json格式的字符串并且写入到文件中
    json.load() 从文件中读取json格式的字符串并且转换为python对象

    示例:

    import jsonlst = [{'name': 'Bob'},{'name': 'Tina'},{'name': 'John'},{'name': 'Daisy'},{'name': 'Kelly'},
    ]
    # 将字典或者列表转换为json格式的字符串。
    json2Str = json.dumps(lst)
    print(json2Str)# 将json格式字符串转换为python对象。
    jsonStr2PythonObj = json.loads(json2Str)
    print(jsonStr2PythonObj)# 将字典或者列表转换为json格式的字符串并且写入到文件中。(Data/python_json.txt为已存在的文件路径)
    json.dump(lst, open('Data/python_json.txt', 'w', encoding='utf-8'))# 从文件中读取json格式的字符串并且转换为python对象。
    obj = json.load(open('Data/python_json.txt', 'r', encoding='utf-8'))
    print(obj)
    

    运行结果如下:

4 jsonpath解析json数据

4.1 安装jsonpath

pip install jsonpath

4.2 xpath与jsonpath语法对比

xpath jsonpath 说明
/ $ 根节点
. @ 当前节点
/ . or [] 子节点
- 父节点,jsonpath不支持
// 递归匹配所有子节点
* * 通配符,匹配所有元素节点
@ - 匹配属性,jsonpath不支持此操作符,因为json是个key-value递归结构,不需要属性访问
[] [] 下标运算符,根据索引获取元素,xpath索引从1开始,jsonpath索引从0开始
| [,] 连接操作符,将多个结果拼接成数组返回,可以使用索引或别名
- [start: end:step] 数组分隔符,xpath不支持
[] ?() 过滤表达式
- () 脚本表达式,使用在底层脚本引擎下面,xpath不支持
() - xpath分组,jsonpath不支持

注意:jsonpath的索引从0开始计数。

4.3 示例

先创建一个books.json文件:

{"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}}
}

解析books.json文件的:

# jsonpath_demo.pyimport json
import jsonpath# 从Data/books.json文件中读取json格式的字符串并且转换为python对象
obj = json.load(open('Data/books.json', 'r', encoding='utf-8'))# 获取所有书的作者
authors = jsonpath.jsonpath(obj, '$.store.book[*].author')
print(authors)# 获取所有的作者
authors= jsonpath.jsonpath(obj, '$..author')
print(authors)# 获取store的所有元素。所有的book和bicycle
store_elements = jsonpath.jsonpath(obj, '$.store.*')
print(store_elements)# 获取store里面的所有东西的price
prices = jsonpath.jsonpath(obj, '$.store..price')
# prices = jsonpath.jsonpath(obj, '$..price')
print(prices)# 获取第三本书的title
book3 = jsonpath.jsonpath(obj, '$..book[2].title')
print(book3)# 获取最后一本书的title
# book_last = jsonpath.jsonpath(obj, '$..book[(@.length-1)]')
book_last = jsonpath.jsonpath(obj, '$..book[-1:].title')
print(book_last)# 获取前面的两本书的title
# book_top2 = jsonpath.jsonpath(obj, '$..book[0,1]')
book_top2 = jsonpath.jsonpath(obj, '$..book[:2].title')
print(book_top2)# 过滤出所有的包含isbn的书
book_isbn = jsonpath.jsonpath(obj, '$..book[?(@.isbn)]')
print(book_isbn)# 过滤出价格低于10的书的title。
book_priceUnder10 = jsonpath.jsonpath(obj, '$..book[?(@.price<10)].title')
print(book_priceUnder10)# 获取book节点中category为reference的书的title
book_fiction = jsonpath.jsonpath(obj, '$.store.book[?(@.category=="reference")].title')
print(book_fiction)# 获取所有元素。
all = jsonpath.jsonpath(obj, '$.*')
print(all)

jsonpath介绍与使用相关推荐

  1. python的jsonpath_python 提取json数据的jsonPath介绍及简单使用

    为什么要用jsonpath 就跟为什么要用xpath一样,jsonpath的设计灵感来源于xpath.一个强大的json数据提取工具.让用户不用编写脚本就可以提取到相应的json数据. jsonpat ...

  2. 【Json】JSONPath之fastJson与Snack3的使用介绍与区别

    文章目录 1.概述 2. JSONPath介绍 2.1. API 2.3. 支持语法 2.4. 语法示例 2.5. API 示例 2.5.1 例1 2.5.2 例2 2.5.3 例3 2.5.4 例4 ...

  3. Python 中使用 jsonpath

    JSONPath 解析 JSON 内容详解(翻译自 github):https://blog.csdn.net/freeking101/article/details/103048514 JSONPa ...

  4. Python深层解析json数据之JsonPath

    我们在做接口自动化时,一般接口响应的都是json数据体,对响应数据进行提取使用或断言,当数据量很大或层级很深时,就会变得很麻烦,于是就可以用到jsonpath模块,解决json路径深取值难的问题. 一 ...

  5. python的json中方法以及jsonpath模块

    什么是json JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交互的场景 ...

  6. fastjson php,Fastjson JSONPath

    1. JSONPath介绍 fastjson 1.2.0之后的版本支持JSONPath.这是一个很强大的功能,可以在java框架中当作对象查询语言(OQL)来使用. 2. API package co ...

  7. jsonpath使用

    1.jsonpath介绍: 首先,JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java. ...

  8. Python接口自动化之接口依赖

    VOL 129 28 2020-05 今天距2021年216天 这是ITester软件测试小栈第129次推文 点击上方蓝字"ITester软件测试小栈"关注我,每周一.三.五早上  ...

  9. python之json格式数据的提取

    1. json的概念: JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式,它使得人们很容易的进行阅读和编写.同时也方便了机器进行解析和生成.适用于进行数据交 ...

最新文章

  1. 用 JS 做一个数独游戏(二)
  2. InfoPath开发
  3. Shell中的常用操作
  4. nginx 如何显示真实ip
  5. ajax get请求_JSP中的对讲机Ajax简述
  6. 跟我一起学.NetCore之Options实例演示及分析
  7. springboot使用curator实现服务的注册和发现
  8. 为什么有了scanf还要getchar()
  9. js去掉所有html标记
  10. Windows 7 with SP1中英文原版MSDN下载汇总
  11. 苹果绕id工具_绕ID教程(iOS13.313.3.1)
  12. 【PowerDesigner】PowerDesigner的下载及安装
  13. 雷达系统概述--距离分辨率
  14. java接收二进制数据,java接口接收二进制流
  15. jsp怎样写一个Button onclick事件
  16. [转载]1986年吴图南 马岳梁 吴英华 孙剑云等名家大師
  17. C++裁剪图像并填充
  18. MAVEN5分钟入门
  19. 倒排表数据结构、通配符查询、拼写纠正详解
  20. 计算机考试记不住题目,驾考科目一口诀,科一题目太多记不住?快来看看这些技巧...

热门文章

  1. CSS 背景渐变、背景透明不改变文字
  2. 探索Apache Camel Core – Seda组件
  3. B02 - 049、查看Kafka集群的方式①:ZooInspector
  4. oracle安装后 服务没有,Oracle10g安装后没有服务项
  5. python 深浅拷贝
  6. PTA:找密码(C语言)
  7. 2022年中国自行车品牌排行榜辐轮王土拨鼠世界十大品牌山地车
  8. 【Visual C++】游戏开发笔记二十二 游戏基础物理建模 四 粒子系统模拟 一
  9. 手机为何老提示网络连接不可用?
  10. 线程池中阻塞队列的作用?为什么是先添加列队而不是先 创建最大线程?