Home JsonPath
Post
Cancel

JsonPath

JsonPath

JSONPath Online Evaluator

1
2
3
4
5
<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.4.0</version>
</dependency>

JsonPath 表达式可以用 . 或者 [] 表示。

  • $.store.book[0].title

  • $['store']['book'][0]['title']

符号

符号描述
$根节点对象
@过滤器处理的当前节点对象
*通配符,可以表示一个名字或数字
..全局匹配
.<name>.表示的子节点
['<name>' (, '<name>')][]表示的子节点
[<number> (, <number>)]数组索引
[start:end]数组切片
[?(<expression>)]过滤器表达式,表达式结果必须是boolean

函数

函数描述输出
min()数组里的最小值Double
max()数组里的最大值Double
avg()数组平均值Double
stddev()数组标准差Double
length()数组长度Integer

过滤器

操作描述
==等于
!=不等
<小于
<=小于等于
>大于
>=大于等于
=~正则表达式,例如 [?(@.name =~ /foo.*?/i)]
in包含, 例如 [?(@.size in [‘S’, ‘M’])]
nin不包含
subsetof子集,例如 [?(@.sizes subsetof [‘S’, ‘M’, ‘L’])]
anyof有交集,例如 [?(@.sizes anyof [‘M’, ‘L’])]
noneof无交集,例如 [?(@.sizes noneof [‘M’, ‘L’])]
size数组、字符串长度相等
empty数组、字符串为空

示例

给定Json:

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
{
    "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
        }
    },
    "expensive": 10
}

JsonPath 表达式及结果:

JsonPath表达式结果(点链接查看在线结果)
$.store.book[*].author全部书的作者
$..author全部作者
$.store.*全部东西
$.store..price全部价格
$..book[2]第3本
$..book[-2]倒数第2本
$..book[0,1]前2本
$..book[:2]前2本
$..book[1:2]第2本
$..book[-2:]最后2本
$..book[2:]第3本到最后
$..book[?(@.isbn)]有 ISBN 的全部书
$.store.book[?(@.price < 10)]价格小于 10 的全部书
$..book[?(@.price <= $[‘expensive’])]价格小于 expensive 的全部书
$..book[?(@.author =~ /.*REES/i)][作者符合正则表达式 /.REES/i 的全部书](https://jsonpath.herokuapp.com/?path=$..book[?(@.author =~ /.REES/i)])
$..*全部
$..book.length()书的数量

用法

  • 单次读取

    1
    2
    3
    
    String json = "...";
      
    List<String> authors = JsonPath.read(json, "$.store.book[*].author");
    
  • 多次读取:先解析 Json 为 ReadContext,再通过 ReadContext 读取,以避免多次解析 Json。

    1
    2
    3
    4
    5
    
    String json = "...";
      
    ReadContext ctx = JsonPath.parse(json);
      
    List<String> authorsOfBooksWithISBN = ctx.read("$.store.book[?(@.isbn)].author");
    

返回值

  • JsonPath 表达式不明确时,返回值为 list 。不明确的表达式包含:

    • ..:全局匹配
    • ?(<expression>):过滤器表达式
    • [<number>, <number> (, <number>)]:多索引
  • JsonPath 表达式明确时,返回值为 POJO。

    1
    2
    3
    4
    
    Configuration conf = Configuration.builder()
                                      .jsonProvider(new GsonJsonProvider())
                                      .build();
    Book book = JsonPath.using(conf).parse(json).read("$.store.book[0]", Book.class);
    
  • 泛型

    1
    2
    3
    
    TypeRef<List<String>> typeRef = new TypeRef<List<String>>() {};
      
    List<String> titles = JsonPath.parse(JSON_DOCUMENT).read("$.store.book[*].title", typeRef);
    

配置

Configuration.builder() 实现对 JsonPath 配置。

1
2
3
Configuration conf = Configuration.builder()
                                  .options(Option.ALWAYS_RETURN_LIST)
                                  .build();

共5个配置选项:

  • Option.DEFAULT_PATH_LEAF_TO_NULL:配置后空节点返回 null。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    
    * [
    *      {
    *         "foo" : "foo1",
    *         "bar" : "bar1"
    *      }
    *      {
    *         "foo" : "foo2"
    *      }
    * ]
    *</pre>
    *
    * the path :
    *
    * "$[*].bar"
    *
    * Without flag ["bar1"] is returned
    * With flag ["bar1", null] is returned
    
  • Option.ALWAYS_RETURN_LIST:配置后返回值为 list,不返回 POJO。

  • Option.AS_PATH_LIST:配置后返回值为路径,非对象。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    Configuration conf = Configuration.builder()
       .options(Option.AS_PATH_LIST).build();
      
    List<String> pathList = using(conf).parse(json).read("$..author");
      
    assertThat(pathList).containsExactly(
        "$['store']['book'][0]['author']",
        "$['store']['book'][1]['author']",
        "$['store']['book'][2]['author']",
        "$['store']['book'][3]['author']");
    
  • Option.SUPPRESS_EXCEPTIONS:配置后异常被抑制。如果同时配置了 ALWAYS_RETURN_LIST ,发生异常时返回 empty list,否则返回 null。

  • Option.REQUIRE_PROPERTIES:禁止通配符。比如 $[*].b,会抛出 PathNotFoundException 异常。

This post is licensed under CC BY 4.0 by the author.