JsonPath

概述

JSONPath - 用于JSON的XPath

用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具.

JsonPath有许多编程语言,如Javascript、Python、PHP、Java等,这里主要总结的是Java的

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

简单的来说,JsonPath就是用来解析json数据的,主要是使用JsonPath表达式去解析,

表达式

  • JsonPath表达式有两种写法,一种是使用点进行表达
$.store.book.[0]
  • 还有一种是使用中括号进行表达
$['store']['book'][0]
  • 两种表达式的效果是一样的

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

语法

JSONPath

描述

$

根节点,用于表示当前的json对象,可以是数组也可以是对象

@

过滤器断言(filter predicate)处理的当前节点对象,类似于java中的this字段,

*

通配符,用于匹配所有的元素,比如匹配数组下的所有元素,可以表示一个名字或数字


递归匹配对应的字段,因为可能会匹配到多个字段,所以最外面都是用[]括起来

.或者[]

表示一个子节点

[start: end]

数组片段,区间为[start,end),不包含end

?()

支持过滤操作

[]

数组,里面可以填写一个数组下标,也可以使用逗号隔开填多个

举例演示

JsonPath

描述

$.store.book[*].author

商店中所有书籍的作者

$…author

所有作者

$.store.*

商店里的所有东西,都是一些书和一辆红色的自行车。

$.store…price

商店里一切的价格。

$…book[2]

第三本书

java jsonpath 表达式 jsonpath语法java_json…book[-1:]

最后一本书。

java jsonpath 表达式 jsonpath语法java_json_02…book[:2]

前两本书

$…book[?(@.isbn)]

用isbn number过滤所有书籍

$…book[?(@.price<10)]

过滤所有便宜10以上的书籍

$…*

XML文档中的所有元素。JSON结构的所有成员。

$…book.length()

获取json中book数组的长度

$…book[?(@.author =~ /.*REES/i)]

获取json中book数组中的作者以REES结尾的所有值(REES不区分大小写)

代码演示

//  获取json中store下book下的所有title值
        List<String> titless = JsonPath.read(json, "$.store.book[*].title");
        System.out.println("$.store.book.title \n " + titless);
        System.out.println();

        // 获取json中所有title的值
        List<String> title = JsonPath.read(json, "$..title");
        System.out.println("$..title \n" + title);
        System.out.println();

        // 获取json中book数组中包含isbn的所有值
        List<Book> isbn = JsonPath.read(json, "$.store.book[?(@.isbn)]");
        System.out.println("$.store.book[?(@.isbn)] \n" + isbn);
        System.out.println();
        // 获取json中book数组中不包含isbn的所有值
        isbn = JsonPath.read(json, "$.store.book[?(!@.isbn)]");
        System.out.println("$.store.book[?(!@.isbn)] \n" + isbn);
        System.out.println();


        // 获取json中book数组中price<10的所有值
        List<Double> prices = JsonPath.read(json, "$.store.book[?(@.price < 10)].price");
        System.out.println("$.store.book[?(@.price < 10)].price \n" + prices);
        System.out.println();

        // 获取json中book数组中的title等于“高效Java”的对象
        List<Book> titles = JsonPath.read(json, "$.store.book[?(@.title == 'The Lord of the Rings')]");
        System.out.println("$.store.book[?(@.title == 'The Lord of the Rings')] \n" + titles);
        System.out.println();

        // 获取json中store下所有price的值
        prices = JsonPath.read(json, "$..price");
        System.out.println("$..price \n" + prices);
        System.out.println();

        // 获取json中book数组的前两个区间值
        List<Book> book = JsonPath.read(json, "$.store.book[0:4]");
        System.out.println("$.store.book[2:4] \n" + book);
        System.out.println();
        // 获取书个数
        int size = JsonPath.read(json, "$.store.book.size()");
        System.out.println("$.store.book.size() \n" + size);
        System.out.println();

        // 获取store中bicycle的颜色
        List<String> color = JsonPath.read(json, "$.store..color");
        System.out.println("$.store..color \n" + color.get(0));

引入依赖

<!--在maven项目中maven维护了一个json-path版本为2.4.0-->
<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
</dependency>
<!--完整-->
<!-- https://mvnrepository.com/artifact/com.jayway.jsonpath/json-path -->
<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.4.0</version>
</dependency>