使用json-path解析json
在我们的日常开发中,有时候需要从一个json字符串中获取一个值,或者从一段json字符串中获取到某些值,如果先使用Gson或Jackson转换成java对象在获取值,有些时候是很麻烦的,那么有没有一种根据表达式提取json中的数据的方式呢,就像使用xpath语法操作xml文件一样,答案是有的,jsonPath就是这样的一个在java中操作json的简单工具。
jsonPath的在github上的网址如下:https://github.com/json-path/JsonPath
一、json-path中的操作符
二、json-path中可以使用的函数
三、过滤操作符
四、表达式使用示例:
1、数据准备
{
"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
}
},
"expensive": 10
}
2、示例代码
五、在JAVA代码中使用
1、pom.xml文件中引入json-path的依赖
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.4.0</version>
</dependency>
2、编写代码
package com.huan.json;
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.List;
import java.util.Map;
import com.jayway.jsonpath.Configuration;
import com.jayway.jsonpath.JsonPath;
import com.jayway.jsonpath.Option;
import com.jayway.jsonpath.spi.json.JsonProvider;
/**
* 测试jsonpath的使用
*
* @描述
* @作者 huan
* @时间 2017年12月31日 - 下午4:34:11
*/
public class JsonPathTest {
public static void main(String[] args) {
String json = readJson();
Configuration configuration = Configuration.defaultConfiguration();
configuration = configuration.addOptions(//
Option.DEFAULT_PATH_LEAF_TO_NULL, // 如果路径不存在则返回null,而不要抛出PathNotFoundException
Option.SUPPRESS_EXCEPTIONS // 抑制异常的抛出,当设置了Option.ALWAYS_RETURN_LIST时返回[],否则返回null
);
// 如果项目中存在gson则此处可以new 一个GsonJsonProvider,那么返回对象
// configuration.jsonProvider(new GsonJsonProvider());
JsonProvider jsonProvider = configuration.jsonProvider();
/**
* 此处预先解析json,默认请情下JsonPath.read方法每掉一次都会重新解析json,此处预先解析好就不用每次都进行解析
*/
Object document = jsonProvider.parse(json);
// 1.获取所有book中的author
List<String> authors = JsonPath.read(document, "$.store.book[*].author");
System.out.println(authors);
// 2.获取价格比$.expensive大的书籍
List<Map<String, Object>> books = JsonPath.read(document, "$.store.book[?(@.price > $.expensive)]");
System.out.println(books);
// 3.输出一个不存在的表达式,因为存在这个选项的配置,所有返回的是Option.DEFAULT_PATH_LEAF_TO_NULL
Object notExistsValue = JsonPath.using(configuration).parse(document).read("$.not-exists-path.path");
System.out.println(notExistsValue);
// 4.存在多级属性缺失
Object object = JsonPath.using(configuration).parse(document).read("$.not-exists.path");
System.out.println(object);
}
public static String readJson() {
StringBuilder builder = new StringBuilder();
try (InputStream is = JsonPathTest.class.getResourceAsStream("data.json"); InputStreamReader isr = new InputStreamReader(is); BufferedReader br = new BufferedReader(isr);) {
String line;
while (null != (line = br.readLine())) {
builder.append(line);
}
} catch (Exception e) {
e.printStackTrace();
}
return builder.toString();
}
}
3、结果
六、注意事项:
1、在json-path的filter中 1 和 '1' 是不相等的。
2、filter中的字符串需要使用单引号或双引号括起来
3、JsonPath.read方法会每次进行json的解析,解决思路就是预先解析json
4、Option中提供了一些枚举值可以控制解析的结果返回
5、如果不想使用默认的JsonProvider则可以自己提供一个。
七、完整的思维导图见附件中。
使用json-path解析json的更多相关文章
- JMeter 插件 Json Path 解析 HTTP 响应 JSON 数据(转)
JMeter 是一个不错的负载和性能测试工具,我们也用来做 HTTP API 接口测试.我们的 API 返回结果为 JSON 数据格式.JSON 简介,JSON 教程. JSON 已经成为数据交换格式 ...
- JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串;JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象
JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串:JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象
- Python | JSON 数据解析(Json & JsonPath)
一.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一 ...
- JMeter 插件 Json Path 解析HTTP响应JSON数据
一.基本简介 JMeter 是一个不错的负载和性能测试工具,我们也用来做 HTTP API 接口测试.我们的 API 返回结果为JSON数据格式.JSON 简介,JSON 教程. JSON 已经成为数 ...
- SQL FOR JSON PATH 返回 json
--直接返回 age FOR JSON PATH --返回值 [{"name":"张学友","age":60}] select c1, c2 ...
- Python3基础 json.loads 解析json格式的数据,得到一个字典
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- JSON.parse 解析json字符串时,遇换行符报错
Json字符串转换成Json对象时候,有两种方式: 假设d是json字符串: 1,eval('(' + d + ')'). 2,JSON.parse(d): 但是以上方式有隐患,如果Json字符串有换 ...
- C#使用Json.NET解析Json
本文转载自 http://xiaosheng.me/2016/10/01/article25/ 最近在 C# 项目中需要使用到 Json 格式的数据,我简单上网搜索了一下,基本上有两种操作 Json ...
- Android原生生成JSON与解析JSON
JSON数据是一种轻量级的数据交换格式,在Android中通常应用于client与server交互之间的传输数据.像如今在网上有非常多解析JSON数据的jar包,可是归根究竟用的都是Android原生 ...
- scala解析json —— json4s 解析json方法汇总
使用json4s的框架,包括spark,flink 1.org.json4s 引入pom的方法 对于本地支持,引入以下依赖项添加到pom中 <dependency> <groupId ...
随机推荐
- Java匿名内部类只可使用一次的理解
匿名内部类只能使用一次,就不能在使用. 为了验证"只能使用一次"的实际含义,首先在程序中实例化了两个对象.并且在相应的类中加入了实现接口的匿名内部类: package com.An ...
- 文件流转换(一般用于axios设置接收文件流设置时responseType: 'blob')
文件流转换 一般用于axios设置接收文件流设置时responseType: 'blob'当接口报错时,前端因已设置responseType: 'blob'无法再接收json格式数据,会把json格式 ...
- SQLSERVER存储过程基础
SQLSERVER存储过程基础 1.声明变量 DECLARE @F001 SMALLINT, (三元素,声明declare+变量名+类型) @F002 INTEGER, @F003 V ...
- 支持Cron表达式、间隔时间的工具(TaskScheduler)
后台任务如何支持间隔时间.Cron表达式两种方式? 分享一个项目TaskScheduler,这是我从Furion项目中拷出来的 源码:https://gitee.com/dot-net-core/ta ...
- Maven专题3——生命周期与插件
三套生命周期 Maven有3套相互独立的生命周期,用户可以调用某个生命周期的阶段,而不会对其他生命周期产生影响. 每个生命周期包含一些有先后顺序的阶段,后面的阶段依赖于前面的阶段,意味着用户调用后面的 ...
- qGPU on TKE - 腾讯云发布下一代 GPU 容器共享技术
背景 qGPU 是腾讯云推出的 GPU 共享技术,支持在多个容器间共享 GPU卡,并提供容器间显存.算力强隔离的能力,从而在更小粒度的使用 GPU 卡的基础上,保证业务安全,达到提高 GPU 使用率. ...
- php保留2位小数方法
$num = 10.4567; //第一种:利用round()对浮点数进行四舍五入 echo round($num,2); //10.46 //第二种:利用sprintf格式化字符串 $format_ ...
- tomcat 跨域的配置
* 允许所有跨域 E:\apache-tomcat-7.0.81\conf\web.xml <filter> <filter-name>CorsFilter</fil ...
- php 设计模式 --适配器
1,目标:实现一个不同的类不同方法,符合一定的规范: 规范类 <?php interface Iplay{ function Attack(); function Defence(); } cl ...
- CF585E-Present for Vitalik the Philatelist【莫比乌斯反演,狄利克雷前缀和】
正题 题目链接:https://www.luogu.com.cn/problem/CF585E 题目大意 给出一个大小为\(n\)的可重集\(T\),求有多少个它的非空子集\(S\)和元素\(x\)满 ...