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技术站