在我们的日常开发中,有时候需要从一个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的更多相关文章

  1. JMeter 插件 Json Path 解析 HTTP 响应 JSON 数据(转)

    JMeter 是一个不错的负载和性能测试工具,我们也用来做 HTTP API 接口测试.我们的 API 返回结果为 JSON 数据格式.JSON 简介,JSON 教程. JSON 已经成为数据交换格式 ...

  2. JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串;JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象

    JSON.stringify()方法是将一个javascript值(对象或者数组)转换成为一个JSON字符串:JSON.parse()解析JSON字符串,构造由字符串描述的javascript值或对象

  3. Python | JSON 数据解析(Json & JsonPath)

    一.什么是JSON? JSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式.它基于 ECMAScript (欧洲计算机协会制定的js规范)的一 ...

  4. JMeter 插件 Json Path 解析HTTP响应JSON数据

    一.基本简介 JMeter 是一个不错的负载和性能测试工具,我们也用来做 HTTP API 接口测试.我们的 API 返回结果为JSON数据格式.JSON 简介,JSON 教程. JSON 已经成为数 ...

  5. SQL FOR JSON PATH 返回 json

    --直接返回 age FOR JSON PATH --返回值 [{"name":"张学友","age":60}] select c1, c2 ...

  6. Python3基础 json.loads 解析json格式的数据,得到一个字典

             Python : 3.7.0          OS : Ubuntu 18.04.1 LTS         IDE : PyCharm 2018.2.4       Conda ...

  7. JSON.parse 解析json字符串时,遇换行符报错

    Json字符串转换成Json对象时候,有两种方式: 假设d是json字符串: 1,eval('(' + d + ')'). 2,JSON.parse(d): 但是以上方式有隐患,如果Json字符串有换 ...

  8. C#使用Json.NET解析Json

    本文转载自 http://xiaosheng.me/2016/10/01/article25/ 最近在 C# 项目中需要使用到 Json 格式的数据,我简单上网搜索了一下,基本上有两种操作 Json ...

  9. Android原生生成JSON与解析JSON

    JSON数据是一种轻量级的数据交换格式,在Android中通常应用于client与server交互之间的传输数据.像如今在网上有非常多解析JSON数据的jar包,可是归根究竟用的都是Android原生 ...

  10. scala解析json —— json4s 解析json方法汇总

    使用json4s的框架,包括spark,flink 1.org.json4s 引入pom的方法 对于本地支持,引入以下依赖项添加到pom中 <dependency> <groupId ...

随机推荐

  1. jq 追加元素的几种方法

    jQuery添加插入元素技巧: jquery添加分为在指定元素的里面添加和外面添加两种: 里面添加使用(append 和prepend) 里面添加又分为在里面的前面添加和后面添加 里面的前面添加使用 ...

  2. php去除html标签

    function cutstr_html($string){ $string = strip_tags($string); $string = preg_replace(["\t" ...

  3. 创建一个Orchard Core CMS 应用程序

    开始使用Orchard Core作为NuGet软件包 在本文中,我们将看到使用Orchard Core提供的NuGet包创建CMS Web应用程序是多么容易. 你可以在这里找到Chris Payne写 ...

  4. 如何实现Orchard Core CMS的全文索引

    Orchard Core提供了Lucene功能,允许您在网站上进行全文搜索.大多数情况下,在运行博客或简单的代理网站时,您可能需要在页面内容中进行搜索.在Orchard Core中,您可以使用Liqu ...

  5. composer install 出现 RuntimeException Failed to execute

    报错:composer.json 的  require添加新包 需要删除composer.lock和vender 从新composer install [RuntimeException] Faile ...

  6. php CURL 发送http请求 GET POST

    * CURL http://www.php.net/manual/en/book.curl.php http://jp2.php.net/manual/en/function.curl-setopt. ...

  7. php 页面公共部分 转化为js document.write(); 并由匿名函数包裹

    页面公共部分以javascript  document.write()方式加载 生成的js放到需要的位置   footer.js 放到body底部引入 ... <script src=" ...

  8. python继承细节

    不要子类化内置类型 内置类型(由C语言编写)不会调用用户定义的类覆盖的特殊方法. 例如,子类化dict作为测验: class DoppeDict(dict): def __setitem__(self ...

  9. P3335-[ZJOI2013]蚂蚁寻路【dp】

    正题 题目链接:https://www.luogu.com.cn/problem/P3335 题目大意 给出\(n\times m\)的网格,每个格子有权值.一个回路在格子的边上,要求有\(2\tim ...

  10. AngularJS的简单实用

    Angular Js 的初步认识和使用    一:        1.模块化            定义模块和控制器  ng-app="myapp"  controller=&qu ...