jsonpath :从入门到精通

打印 上一主题 下一主题

主题 883|帖子 883|积分 2649

码到三十五 :   个人主页  
   在数据处置惩罚和交换领域,JSON已经成为了一种广泛使用的数据格式, 怎样有用地查询和操作这些数据也变得越来越重要。在这种环境下,JSONPath 应运而生,成为了一种在JSON数据中定位和提取信息的强盛工具。
  
  
一、什么是 JSONPath

JSONPath 是一种在JSON数据中查询信息的表达式语言,它允许用户通过一种简便明白的语法来定位和提取JSON对象中的特定数据。与XML的XPath类似,JSONPath 提供了一种灵活且强盛的方式来查询JSON结构中的数据。
二、JSONPath 根本语法

JSONPath 的语法相对简朴,但功能却非常强盛。以下是一些根本的语法规则:

  • $:表现JSON数据的根对象。
  • .[]:用于访问对象的属性或数组的元素。例如,$.name 或 $[‘name’] 都可以访问根对象中的 ‘name’ 属性。
  • :表现递归降落,用于查找所有级别的属性。
  • ?():应用一个过滤表达式来过滤数组中的元素。例如,$?(@.age>18) 将选择所有年龄大于18的对象。
  • []:在属性名或数组索引位置使用,表现选择所有元素。例如,$.students
  • .name 将选择所有学生的名字。
  • -101n:用作数组索引时,表现从末了一个元素开始计数。例如,$.students[-1].name 将选择末了一个学生的名字。

三、JSONPath 高级特性

除了根本语法之外,JSONPath 还提供了一些高级特性,使得数据查询更加灵活和强盛。

  • 通配符与切片:你可以使用 * 通配符来选择所有属性,大概使用切片语法(如 [start:end:step])来选择数组中的特定元素范围。
  • 函数:JSONPath 支持一些内置函数,如 length()(获取数组或字符串长度)、keys()(获取对象所有键)等,这些函数可以在查询中进行更复杂的操作。
  • 条件表达式:通过联合使用 ?() 和逻辑操作符(如 &&、||),你可以构建复杂的条件表达式来过滤数据。
四、JSONPath 应用场景

JSONPath 在多个领域都有广泛的应用,包罗但不限于:

  • 数据验证:通过 JSONPath 表达式,你可以轻松地验证 JSON 数据的结构和内容是否符合预期。
  • 数据提取与转换:在处置惩罚大量 JSON 数据时,JSONPath 可以资助你快速定位和提取所需信息,大概将数据转换为其他格式。
  • 自动化测试:在自动化测试中,你可以使用 JSONPath 来验证 API 相应中的数据是否符合预期。
  • 日志分析:对于包含 JSON 格式的日志文件,JSONPath 可以资助你快速提取和分析关键信息。
五、JSONPath的使用

以下是一些JSONPath的使用,展示了怎样使用JSONPath表达式从JSON数据中提取信息。
假设我们有以下JSON数据:
  1. {
  2.   "store": {
  3.     "book": [
  4.       {
  5.         "title": "Sword of Honour",
  6.         "price": 12.99
  7.       },
  8.       {
  9.         "title": "Moby Dick",
  10.         "price": 8.99
  11.       },
  12.       {
  13.         "title": "The Lord of the Rings",
  14.         "price": 22.99
  15.       }
  16.     ],
  17.     "bicycle": {
  18.       "color": "red",
  19.       "price": 19.95
  20.     }
  21.   },
  22.   "expensive": 10
  23. }
复制代码
起首,必要将JsonPath库添加到项目中。如果你使用Maven,可以在pom.xml文件中添加以下依靠:
  1. <dependency>
  2.     <groupId>com.jayway.jsonpath</groupId>
  3.     <artifactId>json-path</artifactId>
  4.     <version>2.7.0</version> <!-- 请检查是否有更新的版本 -->
  5. </dependency>
复制代码
接下来是Java代码:
  1. import com.jayway.jsonpath.JsonPath;
  2. public class JsonPathExample {
  3.     public static void main(String[] args) {
  4.         String json = "{\n" +
  5.                 "    "store": {\n" +
  6.                 "        "book": [\n" +
  7.                 "            {\n" +
  8.                 "                "title": "Sword of Honour",\n" +
  9.                 "                "price": 12.99\n" +
  10.                 "            },\n" +
  11.                 "            {\n" +
  12.                 "                "title": "Moby Dick",\n" +
  13.                 "                "price": 8.99\n" +
  14.                 "            },\n" +
  15.                 "            {\n" +
  16.                 "                "title": "The Lord of the Rings",\n" +
  17.                 "                "price": 22.99\n" +
  18.                 "            }\n" +
  19.                 "        ],\n" +
  20.                 "        "bicycle": {\n" +
  21.                 "            "color": "red",\n" +
  22.                 "            "price": 19.95\n" +
  23.                 "        }\n" +
  24.                 "    },\n" +
  25.                 "    "expensive": 10\n" +
  26.                 "}\n";
  27.         // 提取所有的书名
  28.         String bookTitlesPath = "$.store.book[*].title";
  29.         Object bookTitles = JsonPath.read(json, bookTitlesPath);
  30.         System.out.println("Book Titles: " + bookTitles);
  31.         // 提取第一本书的价格
  32.         String firstBookPricePath = "$.store.book[0].price";
  33.         Object firstBookPrice = JsonPath.read(json, firstBookPricePath);
  34.         System.out.println("First Book Price: " + firstBookPrice);
  35.         // 提取价格大于10的书名
  36.         String expensiveBookTitlesPath = "$.store.book[?(@.price > 10)].title";
  37.         Object expensiveBookTitles = JsonPath.read(json, expensiveBookTitlesPath);
  38.         System.out.println("Expensive Book Titles: " + expensiveBookTitles);
  39.     }
  40. }
复制代码
起首界说了一个JSON字符串json,然后使用JsonPath.read方法来执行JSONPath查询。分别查询了所有的书名、第一本书的价格以及价格大于10的书名,并将效果打印出来。
下面是使用上述JSON数据的更多JSONPath用法:

  • 提取bicycle的颜色
    JSONPath 表达式: $.store.bicycle.color
    1. String bicycleColorPath = "$.store.bicycle.color";
    2. Object bicycleColor = JsonPath.read(json, bicycleColorPath);
    3. System.out.println("Bicycle Color: " + bicycleColor);
    复制代码
  • 提取不是"Sword of Honour"的所有书名
    为了提取不即是"Sword of Honour"的书名,我们可以使用!=操作符。但请注意,不是所有的JSONPath实现都支持这种比力操作。如果你的实现不支持,你可能必要在应用层面进行过滤。
    假设我们的JSONPath库支持这种比力,表达式可能类似于:
    JSONPath 表达式: $.store.book[?(@.title != 'Sword of Honour')].title
    1. String notSwordOfHonourPath = "$.store.book[?(@.title != 'Sword of Honour')].title";
    2. Object notSwordOfHonourTitles = JsonPath.read(json, notSwordOfHonourPath);
    3. System.out.println("Book Titles Not 'Sword of Honour': " + notSwordOfHonourTitles);
    复制代码
  • 提取最贵的书的价格
    为了获取最贵的书的价格,我们可以先获取所有书的价格,然后在应用层面找到最大值。但如果JSONPath实现支持,我们也可以直接在表达式中使用max()函数。
    JSONPath 表达式(如果支持): $.store.book
  • .price.max()
    在标准的JsonPath中并不直接支持如许的聚合函数,因此你可能必要在Java代码中处置惩罚这个题目:
    1. String allPricesPath = "$.store.book[*].price";
    2. List<Double> allPrices = JsonPath.read(json, allPricesPath);
    3. double maxPrice = Collections.max(allPrices);
    4. System.out.println("Maximum Book Price: " + maxPrice);
    复制代码
  • 检查是否有价格超过20的书
    JSONPath 本身不直接支持返回一个布尔值来表现是否存在满意条件的元素,但你可以在获取效果后判断效果聚集是否为空。
    JSONPath 表达式: $.store.book[?(@.price > 20)]
    1. String expensiveBooksPath = "$.store.book[?(@.price > 20)]";
    2. Object expensiveBooks = JsonPath.read(json, expensiveBooksPath);
    3. boolean hasExpensiveBooks = ((List<?>) expensiveBooks).size() > 0;
    4. System.out.println("Has books priced over 20: " + hasExpensiveBooks);
    复制代码
  • 获取bicycle的价格,并判断其是否大于15
    起首提取bicycle的价格,然后在Java代码中做比力。
    JSONPath 表达式: $.store.bicycle.price
    1. String bicyclePricePath = "$.store.bicycle.price";
    2. Object bicyclePriceObj = JsonPath.read(json, bicyclePricePath);
    3. double bicyclePrice = Double.parseDouble(bicyclePriceObj.toString());
    4. boolean isBicyclePriceGreaterThan15 = bicyclePrice > 15;
    5. System.out.println("Is bicycle price greater than 15? " + isBicyclePriceGreaterThan15);
    复制代码
由于JSONPath的详细实现可能有所不同,某些高级功能(如过滤、聚合等)可能不在所有实现中都可用。如果你使用的JsonPath库不支持这些功能,你可能必要在Java代码中实现相应的逻辑。
结语

JSONPath 作为一种强盛的 JSON 数据查询语言,为我们提供了便捷的数据定位和提取方式。通过深入学习和实践 JSONPath,我们可以或许更好地处置惩罚和利用 JSON 数据,为应用带来更大的便捷。

    听说...关注下面公众号的人都变牛了,纯技能,纯干货 !   


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

熊熊出没

金牌会员
这个人很懒什么都没写!
快速回复 返回顶部 返回列表