Java使用JSONPath解析JSON完整内容详解

Java使用JSONPath解析JSON完整内容详解

什么是JSONPath?

JSONPath是一种与XPath类似的查询语言,用于从JSON文档中提取数据。它易于阅读,功能强大,支持复杂查询和过滤器,因此被广泛用于各种应用程序中。

如何在Java中使用JSONPath解析JSON?

在Java中使用JSONPath解析JSON非常简单,只需要遵循以下步骤:

1. 导入JSONPath库

要使用JSONPath,在项目中导入JSONPath库是首先要做的事。你可以通过Maven或Gradle将其作为依赖项添加到您的项目中:

Maven

<dependency>
    <groupId>com.jayway.jsonpath</groupId>
    <artifactId>json-path</artifactId>
    <version>2.6.0</version>
</dependency>

Gradle

implementation 'com.jayway.jsonpath:json-path:2.6.0'

2. 解析JSON

将JSON文件解析为JSONObject,并把它传递给JSONPath:

String json = "{\"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}}}";

Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);

3. 编写JSONPath查询

编写JSONPath查询语句,使用其提供的各种操作符和函数。下面是一些基本的查询语句:

JSONPath查询 描述
$.store.book[*].author 所有书籍的作者名字
$..author 所有的作者名称
$.store.* 所有商品的详细信息
$.store..price 所有商品价格
$..book[2] 索引2包含的图书
$..book[(@.length-1)] 数组中的最后一个元素
$..book[-1:] 数组中的最后一个元素
$..book[0,1] 索引0和1处的书籍
$..book[:2] 前两本书
$..book[1:2].author 索引1到2之间的作者名字
$..book[?(@.isbn)] 所有包含“isbn”属性的书籍
$.store.book[?(@.price < 10)] 所有价格小于10的书籍
$..book[?(@.price <= $['expensive'])] 所有价格小于或等于定价的书籍
$..book[?(@.author =~ /.*Tolkien$/i)] 正则表达式匹配作者以Tolkien结尾的所有书籍
$..* 所有成员,使用通配符@

4. 检索JSON数据

执行JSONPath查询语句并检索JSON中的数据:

List<String> authors = JsonPath.read(document, "$.store.book[*].author");
String bicycleColor = JsonPath.read(document, "$.store.bicycle.color");

通过上述代码示例,我们可以检索JSON中所有图书的作者,以及自行车的颜色。

示例1

假设有以下JSON结构的数据:

{
    "id": 1,
    "name": "John",
    "email": "john@example.com",
    "phone": "555-555-5555",
    "address": {
        "street": "123 Main St",
        "city": "Anytown",
        "state": "CA",
        "zip": "10000"
    },
    "orders": [
        {
            "id": 1001,
            "date": "2021-01-01",
            "items": [
                {"id": 1, "name": "item1", "price": 10.0},
                {"id": 2, "name": "item2", "price": 20.0}
            ]
        },
        {
            "id": 1002,
            "date": "2021-02-01",
            "items": [
                {"id": 3, "name": "item3", "price": 30.0},
                {"id": 4, "name": "item4", "price": 40.0}
            ]
        }
    ]
}

查询1

查询名为“John”的人的电话:

String json = "json结构";
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
String phone = JsonPath.read(document, "$[?(@.name == 'John')].phone");

查询结果为:

System.out.println(phone); // 555-555-5555

查询2

查询所有订单中卖出的所有商品:

String json = "json结构";
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
List<Map<String, Object>> items = JsonPath.read(document, "$..items[?(@.price > 20)]");

查询结果为:

for (Map<String, Object> item : items) {
    System.out.println(item.get("name") + " - " + item.get("price"));
}

输出:

item2 - 20.0
item3 - 30.0
item4 - 40.0

示例2

假设有以下JSON结构的数据:

{
  "people": [
    {
      "name": "John Doe",
      "age": 42,
      "gender": "Male",
      "nationality": "American"
    },
    {
      "name": "Jane Doe",
      "age": 32,
      "gender": "Female",
      "nationality": "British"
    },
    {
      "name": "Bob Smith",
      "age": 25,
      "gender": "Male",
      "nationality": "Canadian"
    }
  ]
}

查询1

查询所有性别为男的人:

String json = "json结构";
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
List<String> males = JsonPath.read(document, "$.people[?(@.gender == 'Male')].name");

查询结果为:

for (String male : males) {
    System.out.println(male);
}

输出:

John Doe
Bob Smith

查询2

查询所有人的年龄总和:

String json = "json结构";
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
int totalAge = JsonPath.read(document, "$.people[*].age");

查询结果为:

System.out.println(totalAge); // 99

结论

JSONPath提供了一种功能强大且易于阅读的方法来检索JSON文档中的数据。我们可以在Java中来使用它来解析和操作JSON文档。我希望这篇文章能帮助您更好地了解如何使用JSONPath来解析JSON数据。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java使用JSONPath解析JSON完整内容详解 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • 动态网站web开发 PHP、ASP还是ASP.NET

    动态网站是指在响应用户请求时,在服务器端动态生成HTML网页,与之相对的是静态网站,在服务器上提前生成好HTML文件,直接返回给客户端,无法根据用户请求的具体情况进行变动。动态网站的优势在于可以提供更加灵活、多样化的交互方式,而且可以方便地集成各种数据库,完成更加高级的应用功能。 Web应用开发的语言有很多种,但最常见的三种是PHP、ASP和ASP.NET。…

    Java 2023年6月15日
    00
  • Spring Security组件一键接入验证码登录和小程序登录的详细过程

    讲解Spring Security组件一键接入验证码登录和小程序登录的步骤如下: 1. 导入Spring Security组件 在Spring Boot项目中,我们可以很方便地通过引入依赖的方式来导入Spring Security组件。在pom.xml文件中,添加以下依赖: <dependency> <groupId>org.spri…

    Java 2023年6月3日
    00
  • Java实现SHA-256加密算法的完全解析

    Java实现SHA-256加密算法的完全解析 SHA-256加密算法是目前应用最广泛的加密算法之一,本篇文章介绍如何在Java中实现SHA-256加密算法。 什么是SHA-256加密算法 SHA-256是一种哈希算法,将任意长度的二进制值映射为一个较短的固定长度的二进制值(通常是256位)。SHA-256算法基于SHA-2家族的算法,其中”256″表示哈希值…

    Java 2023年5月19日
    00
  • SpringBoot实战记录之数据访问

    下面我就为你详细讲解“SpringBoot实战记录之数据访问”的完整攻略。 一、准备工作 在进行 SpringBoot 数据访问之前,首先需要进行一些准备工作。你需要确保项目中已经添加了以下依赖: <dependency> <groupId>org.springframework.boot</groupId> <ar…

    Java 2023年5月20日
    00
  • 游戏开发常见面试题与知识点整理总结

    游戏开发常见面试题与知识点整理总结 前言 游戏开发是一个涉及众多技术领域的综合性行业,因此在游戏开发岗位的面试中,会涉及到众多的技术领域与知识点。本篇文章将介绍游戏开发常见面试题与知识点,帮助读者了解游戏开发领域的常识,并为游戏开发岗位的应聘者提供参考。 1. 编程基础 作为一个游戏开发者,编程基础是不能缺少的部分。在面试中,经常会涉及到编程相关的面试题,需…

    Java 2023年5月19日
    00
  • 如何避免内存泄漏?

    以下是关于如何避免内存泄漏的完整使用攻略: 什么是内存泄漏? 内存泄漏是指在程序运行过程中,分配的内存空间没有被及时释放,导致内存空间的浪费和程序运行速度的下降。内存泄漏是一种常见的程序错误,如果不及时处理,会导致程序崩溃或者系统崩溃。 如何避免内存泄漏? 为了避免内存泄漏,需要注意以下几点: 1. 及时释放内存 在程序中,如果分配了内存空间,就需要在不需要…

    Java 2023年5月12日
    00
  • 为Java程序员准备的10分钟Perl教程

    为Java程序员准备的10分钟Perl教程是一份旨在通过简短的教学来为Java程序员介绍Perl的基础知识的文档。下面是一份完整攻略: 简介 在这份教程中,我们将学习Perl的基础知识。Perl是一种通用的脚本语言,特别适合快速开发。Perl有一个庞大的社区以及丰富的文档和库。 变量 在Perl中声明变量不需要指定类型。变量的类型会随着所存储的数据类型而变化…

    Java 2023年5月23日
    00
  • springcloud-gateway集成knife4j的示例详解

    下面是关于“springcloud-gateway集成knife4j的示例详解”的攻略: 1. 准备工作 在Spring Boot项目中添加以下依赖: <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-clo…

    Java 2023年5月31日
    00
合作推广
合作推广
分享本页
返回顶部