• JsonPath 数据快速查找和提取工具


    介绍

    JsonPath,类似于XPathXML中的作用。其提供了对格式Json数据的解析能力

    操作符

    • $ 查询的根节点,其中根节点可以是数组或对象
    • .['name']JsonPath表达式可以使用点语法、括号语法来访问子节点
    • .. 可进行递归搜索,例如:$..phone
    • ['name'(, 'name')] 对于括号语法而言,其还支持访问多个子节点
    • [ (, )] 针对数组元素的索引操作符
    • [start:end] 针对数组元素的切片操作符,其表示获取索引在[start,end)区间范围的元素。
    • * 通配符
    • @ 用于下文所述过滤器表达式当中,用于指代过滤器当前正在处理的节点对象。其效果类似于Java中的this关键字
    • [?()] 过滤器表达式,表达式结果必须是布尔值。
      • 过滤器支持地操作符,常见地有:
        • == 判断是否相等
        • != 判断是否不相等
        • < 判断是否小于
        • <= 判断是否小于等于
        • > 判断是否大于
        • >= 判断是否大于等于
        • =~ 判断左侧是否匹配右侧的正则
        • in 判断左侧是否存在于右侧的集合中
        • nin 判断左侧是否不存在于右侧的集合中
        • subsetof 判断左侧是否为右侧集合的子集
        • anyof 判断左侧是否与右侧集合存在交集
        • noneof 判断左侧是否与右侧集合无交集
        • size 判断左侧数组长度或字符串长度是否为指定值

    常用语法

    表达式说明
    $表示根元素
    $.key选择根元素下的指定键名的值
    $.*选择根元素下的所有属性值
    $.array[*]选择根元素中的数组的所有元素
    $.key[subkey]选择根元素中的键名为key,子键名为subkey的值
    $.key[*].subkey选择根元素中的键名为key的所有元素的子键名为subkey的值

    过滤表达式

    表达式说明
    $.key[?(@.subkey == value)]选择根元素中key为指定值且具有subkey并且值等于value的元素
    $.array[?(@.value > 10)]选择根元素中值大于10的数组元素

    范围表达式

    表达式说明
    $.array[start:end]选择根元素中从start索引到end索引之间的数组元素
    $.array[:end]选择根元素中从开头到end索引之间的数组元素
    $.array[start:]选择根元素中从start索引到末尾的数组元素

    通配符表达式

    表达式说明
    $.*选择根元素下的所有键值对
    $…key选择根元素和所有子元素中的具有指定键名的值

    操作符表达式

    表达式说明
    $.key[?(@.value > 10 && @.value < 20)]选择根元素中值大于10且小于20的key
    $.key[?(@.name =~ /pattern/)]选择根元素中name符合正则表达式pattern的key

    操作实战

    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,
    			"isbn": "0-553-21311-3"
    		}],
    		"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

    引入依赖

     		<dependency>
                <groupId>com.alibaba.fastjson2groupId>
                <artifactId>fastjson2artifactId>
                <version>2.0.40version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5

    示例

    public static void main(String[] args) {
            String jsonStr = "{ \"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,\"isbn\": \"0-553-21311-3\"" +
                    "}],\"bicycle\": {\"color\": \"red\",\"price\": 19.95}}}";
            JSONObject jsonObject = JSON.parseObject(jsonStr);
            System.out.println(jsonStr);
    
            System.out.println("book数目:"+ JSONPath.eval(jsonObject, "$.store.book.size()") );
            System.out.println("第一本书的title:"+JSONPath.eval(jsonObject,"$.store.book[0].title"));
            System.out.println("第一本书的category和author:"+JSONPath.eval(jsonObject,"$.store.book[0]['category','author']"));
            System.out.println("price>10的书:"+JSONPath.eval(jsonObject,"$.store.book[?(@.price > 10)]"));
            System.out.println("price>8的书的标题:"+JSONPath.eval(jsonObject,"$.store.book[?(@.price > 8)]"));
            System.out.println("price>7的书:"+JSONPath.eval(jsonObject,"$.store.book[?(@.price > 7)]"));
            System.out.println("price>7的书的标题:"+JSONPath.eval(jsonObject,"$.store.book[?(@.price > 7)].title"));
            System.out.println("书的标题为Sayings of the Century:"+JSONPath.eval(jsonObject,"$.store.book[?(@.title='Sayings of the Century')]"));
            System.out.println("bicycle的所有属性:"+JSONPath.eval(jsonObject,"$.store.bicycle.*"));
            System.out.println("bicycle:"+JSONPath.eval(jsonObject,"$.store.bicycle"));
            System.out.println("所有price:"+JSONPath.eval(jsonObject,"$.store.book[*].price"));
    
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

  • 相关阅读:
    《好笑的爱》阅读笔记
    微机原理与接口技术复习题
    Solon for JDK 21,虚拟线程逆天!!!
    #Paper Reading# Pre-trained Language Model based Ranking in Baidu Search
    大数据Hadoop系列之Hadoop Web控制台添加身份验证
    一款非常容易上手的报表工具,简单操作实现BI炫酷界面数据展示,驱动支持众多不同类型的数据库,可视化神器,免开源了
    Java项目:SSH的自动排课系统-遗传算法
    android13(T) SystemUI 运营商显示 bug 修复
    1204、基础查询进阶、连接查询
    Python连接MySQL数据库(简单便捷)
  • 原文地址:https://blog.csdn.net/laow1314/article/details/134212477