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日

相关文章

  • spring boot系列之集成测试(推荐)

    下面为您详细讲解“Spring Boot系列之集成测试(推荐)”的完整攻略。 什么是集成测试? 集成测试是一项对系统不同部分集成后的整体运行进行测试的活动。这种测试的目的是确定应用程序不同单元之间的交互是否正常。通过集成测试,我们可以确认系统中的不同部分是否在正确的接口下合作。 在Spring Boot中,使用集成测试会包含众多的复杂性。要进行集成测试,您需…

    Java 2023年5月15日
    00
  • Nginx自定义访问日志的配置方式

    下面详细讲解一下“Nginx自定义访问日志的配置方式”的完整攻略,具体步骤如下: 1. 确认Nginx的日志模块是否已经安装 在开始配置之前,我们需要确保本机上已经安装了Nginx的日志模块,可以通过以下命令进行确认: nginx -V 2>&1 | grep -o with-http_log_module 如果终端上显示了“with-http…

    Java 2023年6月15日
    00
  • Java HttpURLConnection超时和IO异常处理

    Java中的HttpURLConnection是HTTP协议的实现,是进行HTTP通信的基础。在使用HttpURLConnection进行网络请求时,会遇到超时和IO异常等问题,需要进行相应的处理。本文将详细讲解如何处理HttpURLConnection超时和IO异常。 HttpURLConnection超时处理 超时类型 HttpURLConnection…

    Java 2023年5月27日
    00
  • Java项目的目录结构详解

    下面我来详细讲解Java项目的目录结构: 1. 为什么需要规范的目录结构 在一个Java项目中使用规范的目录结构,可以帮助我们清晰地组织我们写的代码,管理项目中的不同模块,提高我们的项目管理和团队协作效率。 2. Java项目的目录结构 下面是Java项目的目录结构示意图: project ├── src │ ├── main │ │ ├── java # …

    Java 2023年5月20日
    00
  • java简单实现复制 粘贴 剪切功能代码分享

    Java简单实现复制、粘贴、剪切功能 1. 实现方式 Java实现复制、粘贴、剪切功能可以使用AWT和Swing的内置类实现,也可以通过API实现。 1.1 使用AWT、Swing类实现 Java的AWT和Swing类库中提供了对剪切板(Clipboard)的支持。可以通过Toolkit类的getSystemClipboard方法获取系统剪切板。 Java提…

    Java 2023年5月27日
    00
  • Java 9 中的模块Module系统

    关于Java 9中的模块(Module)系统,这里为您整理了完整的攻略。请您仔细阅读以下文章。 什么是Module系统 Java 9中引入了一种新的概念——Module系统,来管理和组织代码。作为Java9中最重要的新特性之一,模块化系统的引入为我们开发、维护和交付大规模的Java应用程序提供了更多的选择和优化。 为什么引入Module系统 随着时间的推移,…

    Java 2023年5月24日
    00
  • Java @Value(“${xxx}”)取properties时中文乱码的解决

    当我们使用Java中的注解@Value(“${xxx}”)来读取.properties配置文件中的中文值时,很容易出现中文乱码的问题。下面是针对这个问题的完整攻略。 步骤一:配置文件 首先,需要在项目中添加一个.properties配置文件,用于存放需要读取的配置属性。例如,我们可以在项目中添加一个config.properties文件,其内容如下: # 中…

    Java 2023年5月20日
    00
  • MAC 在类路径或引导类路径中找不到程序包 java.lang问题

    在编译或运行 Java 代码时,你可能会遇到 java.lang 包找不到的问题。在此情况下,你可以按照以下攻略进行排除问题: 1. 确认 JDK 和 JRE 是否正常安装并配置 首先,你需要确认已经正确安装并配置了 JDK 和 JRE 环境变量。 请在终端中输入以下命令查看 JDK 版本: javac -version 查看 JRE 版本: java -v…

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