zoukankan      html  css  js  c++  java
  • 实用的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属性的书

    表达式:$..book[?(@.isbn)]

     

    获取price小于10 的书

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

     

    获取book节点下书的总数量

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

     

    python中应用举例:

    注:这里的obj代指json对象

  • 相关阅读:
    html图片预览
    网易DBA私享会分享会笔记2
    网易DBA私享会分享会笔记1
    centos6.5适用的国内yum源:网易、搜狐
    如何去除 ckeditor 上传图片后在原码中留下的 style="width: 100%;height:100px"之类的代码呢?
    关于json.ajax ,php的那点事
    去掉所有的html标签
    about JNI
    some knowledge of maven {maven实战}
    What is Proguard?
  • 原文地址:https://www.cnblogs.com/tython/p/12840083.html
Copyright © 2011-2022 走看看