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日

相关文章

  • Java 详细讲解线程安全与同步附实例与注释

    Java 详细讲解线程安全与同步附实例与注释 什么是线程安全? 线程安全是指多线程环境下,多个线程访问同一个对象时,不会产生冲突或者干扰,同时保证数据的正确性。 什么是同步? 同步是指在多线程环境下,对共享资源的访问被限定为一个线程访问,从而保证多线程下数据的一致性和正确性。 Java提供两种机制实现同步:synchronized关键字和Lock接口。 sy…

    Java 2023年5月18日
    00
  • java实现压缩字符串和java字符串过滤

    Java实现压缩字符串: 在Java中,可以使用GZip或Zip压缩算法来实现字符串压缩。下面是一个使用GZip算法压缩字符串的示例代码: import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import …

    Java 2023年5月26日
    00
  • springboot jackson配置教程

    下面是SpringBoot Jackson配置教程的完整攻略,包括Jackson的基本功能、注解、配置、示例等详细步骤。 一、什么是Jackson Jackson是Java编程语言中用于将Java对象序列化为JSON(JavaScript对象表示)和反序列化从JSON返回Java对象的库。它是一种流行的JSON库,可以快速轻松地将Java对象转换为JSON格…

    Java 2023年5月26日
    00
  • Spring中事务管理的四种方法(银行转账为例)

    请看我以下的详细讲解。 Spring中事务管理的四种方法 Spring中提供了四种常用的方式来管理事务,分别是: 通过AOP实现声明式事务管理 通过编程式事务管理 通过注解实现声明式事务管理 通过TransactionTemplate实现编程式事务管理 对于每种事务管理方式,我们将通过银行转账的例子进行说明。 1. 通过AOP实现声明式事务管理 在这种方式中…

    Java 2023年5月20日
    00
  • SpringSecurity 自定义表单登录的实现

    下面是SpringSecurity自定义表单登录的实现攻略: 1. 确定用户信息来源 在进行 SpringSecurity 表单登录认证之前,我们需要确定用户信息的来源。通常,我们可以从数据库、LDAP、Active Directory 或者使用第三方的 SAML/OAuth2 身份验证服务中获取用户信息,这里我们以数据库中获取用户信息为例。 2. 用户认证…

    Java 2023年5月20日
    00
  • JsChart组件使用详解

    JsChart组件使用详解 简介 JsChart是一个基于JavaScript的图表库,可以通过该组件实现多种类型的图表(如折线图、柱形图、饼图等)展示,并支持自定义配置和风格。 安装 可以通过npm进行安装: npm install jchart 或者下载jchart.min.js文件,引入到HTML页面中: <script type="t…

    Java 2023年6月15日
    00
  • 详解SpringMVC的url-pattern配置及原理剖析

    简介 在Spring MVC中,url-pattern是一个非常重要的配置项,它决定了哪些请求会被分发给Spring MVC的DispatcherServlet进行处理。本文将详细介绍url-pattern的配置方式及其原理,并提供两个示例说明。 url-pattern的配置方式 在Spring MVC中,url-pattern可以通过多种方式进行配置,如在…

    Java 2023年5月17日
    00
  • Java String类的理解及字符串常量池介绍

    Java String类是Java中最重要的类之一,它用于表示字符串类型的数据。在Java程序中,字符串常常用于数据传递、文件操作、网络编程等多个场景中。本文将介绍Java String类的基本概念、使用方法,并讲解Java字符串常量池的概念和使用方法。 Java String类 基本概念 Java String类是一个不可变的、线程安全的类,它用于表示字符…

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