阅读 672

jsonpath语法大全_jsonpath使用详解

json-path 组件使用

java 版 jsonpathjava 版 jsonpath

引入依赖

 复制        <dependency>
            <groupId>com.jayway.jsonpath</groupId>
            <artifactId>json-path</artifactId>
            <version>2.4.0</version>
        </dependency>

语法说明

JsonPath语法要点:

  • $ 表示文档的根元素

  • @ 表示文档的当前元素

  • .node_name 或 ['node_name'] 匹配下级节点

  • [index] 检索数组中的元素

  • [start:end:step] 支持数组切片语法

  • * 作为通配符,匹配所有成员

  • .. 子递归通配符,匹配成员的所有子元素

  • (<expr>) 使用表达式

  • ?(<boolean expr>)进行数据筛选

示例

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

 

获取bicycle的price

JsonPath 表达式:$.store.bicycle.price

 复制String read = JsonPath.parse(jsonString).read("$.store.bicycle.price", String.class);
System.out.println(read);

结果:

 复制19.95

 

所有book的author节点

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

 复制List<String> read = JsonPath.parse(jsonString).read("$.store.book[*].author", new TypeRef<List<String>>() {});

结果:

 复制["Nigel Rees","Evelyn Waugh","Herman Melville","J. R. R. Tolkien"]

 

所有author节点

JsonPath 表达式: $..author

 复制List<JSONObject> read = JsonPath.parse(jsonString).read("`$..author`", new TypeRef<List<JSONObject>>() {});

结果:

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

 

store下的所有节点,book数组和bicycle节点

JsonPath 表达式:$.store.*

 复制List<JSONObject> read = JsonPath.parse(jsonString).read("$.store.*", new TypeRef<List<JSONObject>>() {});

结果:

 复制[
    [
        {
            "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
        }
    ],
    {
        "color":"red",
        "price":19.95
    }
]

 

store下的所有price节点

JsonPath 表达式:$.store..price

 复制List<JSONObject> read = JsonPath.parse(jsonString).read("$.store..price", new TypeRef<List<JSONObject>>() {});

结果:

 复制[8.95,12.99,8.99,22.99,19.95]

 

匹配第3个book节点

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

 复制List<JSONObject> read = JsonPath.parse(jsonString).read("$..book[2]", new TypeRef<List<JSONObject>>() {});

结果:

 复制[{"category":"fiction","author":"Herman Melville","title":"Moby Dick","isbn":"0-553-21311-3","price":8.99}]

 

匹配倒数第1个book节点

JsonPath 表达式:$..book[-1:]

 复制List<JSONObject> read = JsonPath.parse(jsonString).read("$..book[-1:]", new TypeRef<List<JSONObject>>() {});

结果:

 复制[{"category":"fiction","author":"J. R. R. Tolkien","title":"The Lord of the Rings","isbn":"0-395-19395-8","price":22.99}]

 

匹配前两个book节点

JsonPath 表达式:$..book[0,1],或 $..book[:2]

 复制List<JSONObject> read = JsonPath.parse(jsonString).read("$..book[0,1]", new TypeRef<List<JSONObject>>() {});

结果:

 复制[{"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}]

 

book节点下过滤含isbn字段的节点

JsonPath 表达式:$.store.book[*][?(@.isbn)] 不包含 $.store.book[*][?(!@.isbn)]

 复制List<JSONObject> read = JsonPath.parse(jsonString).read("$.store.book[*][?(@.isbn)]", new TypeRef<List<JSONObject>>() {});

结果:

 复制[
    {
        "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
    }
]

 

过滤book price<10的节点

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

 复制List<JSONObject> read = JsonPath.parse(jsonString).read("$..book[?(@.price<10)]", new TypeRef<List<JSONObject>>() {});

结果:

 复制[
    {
        "category":"reference",
        "author":"Nigel Rees",
        "title":"Sayings of the Century",
        "price":8.95
    },
    {
        "category":"fiction",
        "author":"Herman Melville",
        "title":"Moby Dick",
        "isbn":"0-553-21311-3",
        "price":8.99
    }
]

 

 

与xPath对比

XPathJsonPathResult
/store/book/author$.store.book[*].author所有book的author节点
//author$..author所有author节点
/store/*$.store.*store下的所有节点,book数组和bicycle节点
/store//price$.store..pricestore下的所有price节点
//book[3]$..book[2]匹配第3个book节点
//book[last()]$..book[(@.length-1)],或 $..book[-1:]匹配倒数第1个book节点
//book[position()<3]$..book[0,1],或 $..book[:2]匹配前两个book节点
//book[isbn]$..book[?(@.isbn)]过滤含isbn字段的节点
//book[price<10]$..book[?(@.price<10)]过滤price<10的节点
//*$..*递归匹配所有子节点


文章分类
后端
文章标签
版权声明:本站是系统测试站点,无实际运营。本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 XXXXXXo@163.com 举报,一经查实,本站将立刻删除。
相关推荐