• jsonpath介绍与使用


    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 json
      
      lst = [
          {'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)
      
      • 1
      • 2
      • 3
      • 4
      • 5
      • 6
      • 7
      • 8
      • 9
      • 10
      • 11
      • 12
      • 13
      • 14
      • 15
      • 16
      • 17
      • 18
      • 19
      • 20
      • 21
      • 22
      • 23

      运行结果如下:
      在这里插入图片描述

    4 jsonpath解析json数据

    4.1 安装jsonpath

    pip install jsonpath
    
    • 1

    4.2 xpath与jsonpath语法对比

    xpathjsonpath说明
    /$根节点
    .@当前节点
    /. 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
        }
      }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

    解析books.json文件的:

    # jsonpath_demo.py
    
    import 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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
  • 相关阅读:
    Socks5代理和代理IP:网络工程师的多面利器
    c语言编程请增补函数fun
    【算法】直接插入排序解析
    redis5.0配置一主两从三哨兵
    类ChatGPT大模型LLaMA及其微调模型
    【图像处理】基于形状提取和模式匹配组合的面部特征点提取方法(Matlab代码实现)
    【Spring 源码】AOP 的加载原理(一)
    深入URP之Shader篇6: SimpleLit Shader分析(2) Vertex Shader
    《硅基物语.AI写作高手:从零开始用ChatGPT学会写作》&《从零开始读懂相对论》
    WPF网格类型像素着色器
  • 原文地址:https://blog.csdn.net/weixin_49026134/article/details/126467446