实用的jsonpath模块

1.简介

jsonpath一般用来解析多层嵌套的json数据,语法规则类似于xpath

2.下面以官网上的一段json数据做为demo我们来做解析操作,读者可在http://jsonpath.com/上面进行解析验证操作

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

例如,我们要提取该json字符串中的所有price字段的信息,可以用以下方式:

表达式:$..price

返回值:[8.95,  12.99,  8.99,  22.99,  19.95]

是不是一行代码搞定,非常简单快捷,下面请看jsonpath的语法规则

 

 

3. 操作符

符号

描述

$

查询的根节点对象,用于表示一个json数据,可以是数组或对象

@

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

*

通配符,可以表示一个名字或数字

..

可以理解为递归搜索,Deep scan. Available anywhere a name is required.

.<name>

表示一个子节点

[‘<name>’ (, ‘<name>’)]

表示一个或多个子节点

[<number> (, <number>)]

表示一个或多个数组下标

[start:end]

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

[?(<expression>)]

过滤器表达式,表达式结果必须是boolean

 

4. 函数

可以在JsonPath表达式执行后进行调用,其输入值为表达式的结果。

名称

描述

输出

min()

获取数值类型数组的最小值

Double

max()

获取数值类型数组的最大值

Double

avg()

获取数值类型数组的平均值

Double

stddev()

获取数值类型数组的标准差

Double

length()

获取数值类型数组的长度

Integer

 

5. 过滤器

过滤器是用于过滤数组的逻辑表达式,一个通常的表达式形如:[?(@.age > 18)],可以通过逻辑表达式&&或||组合多个过滤器表达式,例如[?(@.price < 10 && @.category == ‘fiction’)],字符串必须用单引号或双引号包围,例如[?(@.color == ‘blue’)] or [?(@.color == “blue”)]。

操作符

描述

==

等于符号,但数字1不等于字符1(note that 1 is not equal to ‘1’)

!=

不等于符号

<

小于符号

<=

小于等于符号

>

大于符号

>=

大于等于符号

=~

判断是否符合正则表达式,例如[?(@.name =~ /foo.*?/i)]

in

所属符号,例如[?(@.size in [‘S’, ‘M’])]

nin

排除符号

size

size of left (array or string) should match right

empty

判空符号

 

6.举例:

获取book节点下的所有author

表达式:$.store.book[*].author   或者   $..author

 

获取store下的所有price

表达式:$.store..price

 

获取book节点下前两本书

表达式:$..book[0,1]        或者切片的方式    $..book[:2]

 

获取book节点下的最后的两本书

表达式:$..book[-2:]

 

获取所有具有isbn属性的书

表达式:

 

获取price小于10 的书

表达式:$..book[?(@.price<10)]

 

获取book节点下书的总数量

表达式:$..book.length()

 

python中应用举例:

实用的jsonpath模块

注:这里的obj代指json对象

相关推荐