【Python JsOnpath提取语法 11】

JSONPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括Javascript、Python、PHP和Java(如:数据json类型提取,接口返回值提取)。

特点:

  • 获取不到返回False,不会报错
  • 返回的类型是list

安装

pip install jsonpath

 jsonpath的使用:

obj = json.load(open('json文件', 'r', encoding='utf‐8'))
 
ret = jsonpath.jsonpath(obj, 'jsonpath语法')

jsonpath语法元素和对应XPath元素的对比:

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

实例操作:

复制代码
data = {
    "store": {
    "book": [
      { "category": "修真",
        "author": "六道",
        "title": "坏蛋是怎样练成的",
        "price": 8.95
      },
      { "category": "修真",
        "author": "天蚕土豆",
        "title": "斗破苍穹",
        "price": 12.99
      },
      { "category": "修真",
        "author": "唐家三少",
        "title": "斗罗大陆",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "修真",
        "author": "南派三叔",
        "title": "星辰变",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "author": "老马",
      "color": "黑色",
      "price": 19.95
    }
  }
}
复制代码

 

JsonPath (点击链接测试)结果
$.store.book[*].author 获取json中store下book下的所有author值
$..author 获取所有json中所有author的值
$.store.* 所有的东西
$.store..price 获取json中store下所有price的值
$..book[2] 获取json中book数组的第3个值
$..book[-2] 倒数的第二本书
$..book[0,1] 前两本书
$..book[:2] 从索引0(包括)到索引2(排除)的所有图书
$..book[1:2] 从索引1(包括)到索引2(排除)的所有图书
$..book[-2:] 获取json中book数组的最后两个值
$..book[2:] 获取json中book数组的第3个到最后一个的区间值
$..book[?(@.isbn)] 获取json中book数组中包含isbn的所有值
$.store.book[?(@.price < 10)] 获取json中book数组中price<10的所有值
$..book[?(@.price <= $['expensive'])] 获取json中book数组中price<=expensive的所有值
$..book[?(@.author =~ /.*REES/i)] 获取json中book数组中的作者以REES结尾的所有值(REES不区分大小写)
$..* 逐层列出json中的所有值,层级由外到内
$..book.length() 获取json中book数组的长度

 

复制代码
data = {
    "student":
       [
            {"name":"逍遥","age":"13",},
            {"name":"星瀚","age":"11"},
            {"name":"骆驼","age":"15"},
           {"school":"101中学"}

        ]
}
'''
..表示通过相对路径取值,通过递归取值
'''
print('$.student======',jsonpath.jsonpath(data,"$.student"))  #获取student下所有的数据
print('$[student]=======',jsonpath.jsonpath(data,"$[student..school]"))  #获取student下所有的数据,区别在于[]它的功能更强大,如[$[student..school]
print('$.school========',jsonpath.jsonpath(data,"$..school"))     #获取到任意指定key的value值
print('$.*=======',jsonpath.jsonpath(data,"$.*")) #获取student下所有的数据
复制代码

 结果:

$.student====== [[{'name': '逍遥', 'age': '13'}, {'name': '星瀚', 'age': '11'}, {'name': '骆驼', 'age': '15'}, {'school': '101中学'}]]
$[student]======= ['101中学']
$.school======== ['101中学']
$.*======= [[{'name': '逍遥', 'age': '13'}, {'name': '星瀚', 'age': '11'}, {'name': '骆驼', 'age': '15'}, {'school': '101中学'}]]

更加详细Jsonpath内容:https://www.cnblogs.com/wynjauu/articles/9556396.html

posted @ 2022-07-29 09:59  尘封~~  阅读(140)  评论(0编辑  收藏  举报