使用JsonPath字符串获取json内容

本文介绍了 JSON 路径表示法(JSON Path),它是用于在 JSON 数据中定位和访问特定值的表达式语言,类似 XPath 对 XML 数据的作用。文中阐述了常用符号、语法、表达式,还给出了表示法示例及使用方法,如通过 pom 引入 jar。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

        JSON 路径表示法(JSON Path)是一种用于在 JSON 数据中定位和访问特定值的表达式语言。它类似于 XPath 对于 XML 数据的作用。

        GitHub - json-path/JsonPath: Java JsonPath implementation

JSON 路径表示法中常用的一些符号和语法:
  • $:表示根节点。
  • .:表示当前节点。
  • ..:表示递归下降,用于匹配任意层级的节点。
  • *:表示通配符,匹配任意名称的节点。
  • @: 筛选器
  • []:用于索引和过滤节点。
  • [,]:用于多个索引或过滤条件。
  • [start:end:step]:用于切片操作,类似于 Python 中的切片语法。
  • [?(<expression>)] : 筛选表达式。表达式的计算结果必须为布尔值。
JSON 路径表中的表达式
  • == :equal相等
  • != : 不相等
  • < :小于
  • <= :小于等于
  • >: 大于
  • >= :大于等于
  • =~ :正则表达式,左边值,右边正则表达式
  • in :包含
  • nin :不包含
  • subsetof :子集
  • anyof :相交
  • noneof:不相交
  • size:对象大小匹配,length或size
  • empty :为空
 JSON 路径表示法:
  • $ :表示根节点
  • . :表示当前节点
  • $.data:表示获取当前节点中的data节点
  • $..* :表示根节点下所有节点
  • $.data[0].phone:data节点下第1个对象中的phone节点
  • $.data[*].phone:data节点下所有对象中的phone节点
  • $.data[:2].phone: data节点下前两个对象中的phone节点
  • $.data[-1]:data节点最后一个节点
  • $.data[-2:]:data节点最后两个节点
  • $.store.book[?(@.price < 10)]:store中price值<10的book
  • $..book[?(@.price <= $['expensive'])] 所有price值<expensive值的book

举例

json数据

{
    "store": {
        "book": [
            {
                "title": "Sayings of the Century",
                "price": 8.95
            },
            {
                "title": "Sword of Honour",
                "price": 12.99
            },
            {
                "title": "Moby Dick",
                "price": 8.99
            },
            {
                "title": "The Lord of the Rings",
                "price": 22.99
            }
        ],
        "bicycle": {
            "color": "red",
            "price": 19.95
        }
    },
    "expensive": 10
}
  •  $.store.book :所有book集合
  • $.store.book[?(@.price > 10)] : price值大于10的所有book集合
  • $.store.book[?(@.title == 'Sword of Honou')]: title等于 'Sword of Honou'的所有book集合
  • $.store.book[?(@.title size 7)]:title字符串长度为7的所有book集合
  • $.store[?(@.book.size() > 4)].book:book集合大于4的的所有book集合

使用方法

 使用方法pom引入jar

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.6.0</version>
</dependency>
@Test
    public void jsonPath() {
        String json = "{" +
                "\"data\":[" +
                "{\"name\":\"John\",\"phone\":\"1234567890\"}," +
                "{\"name\":\"Jane\",\"phone\":\"9876543210\"}" +
                "]," +
                "\"user\":{" +
                "\"name\":\"lizz\"" +
                "}," +
                "\"code\":\"123\"" +
                "}";

        // 解析 JSON
        Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);

        // 当前节点下的code节点
        String path = "$.code";
        Object result = JsonPath.read(document, path);
        System.out.println(result);
        // 所有节点
        path = "$..*";
        result = JsonPath.read(document, path);
        System.out.println(JSON.toJSONString(result));

        // 执行data节点中所有phone节点
        path = " $.data[*].phone";
        result = JsonPath.read(document, path);
        System.out.println(result);

        // 执行data节点中index为1对象中的phone节点
        path = "$.data[0].phone";
        result = JsonPath.read(document, path);
        System.out.println(result);


        // 执行data节点中所有phone节点
        path = " $.data[-1].phone";
        result = JsonPath.read(document, path);
        System.out.println(result);
    }

 结果

- Evaluating path: $['code']
123

- Evaluating path: $..[*]
[[{"name":"John","phone":"1234567890"},{"name":"Jane","phone":"9876543210"}],{"name":"lizz"},"123",{"$ref":"$[0][0]"},{"$ref":"$[0][1]"},"John","1234567890","Jane","9876543210","lizz"]

- Evaluating path: $['data'][*]['phone']
["1234567890","9876543210"]

 - Evaluating path: $['data'][0]['phone']
1234567890

- Evaluating path: $['data'][-1]['phone']
9876543210

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lizz666

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值