JSONPath-简单入门
- JSONPath - 是xpath在json的应用。
- JSONPath 表达式
$.store.book[0].title
$['store']['book'][0]['title']
[start:end:step]是从ECMASCRIPT 4 参照过来的。$.store.book[(@.length-1)].title
$.store.book[?(@.price < 10)].title
| XPath | JSONPath | Description |
| / | $ | 表示根元素 |
| . | @ | 当前元素 |
| / | . or [] | 子元素 |
| .. | n/a | 父元素 |
| // | .. | 递归下降,JSONPath是从E4X借鉴的。 |
| * | * | 通配符,表示所有的元素 |
| @ | n/a | 属性访问字符 |
| [] | [] |
子元素操作符
|
| | | [,] |
连接操作符在XPath 结果合并其它结点集合。JSONP允许name或者数组索引。
|
| n/a | [start:end:step] |
数组分割操作从ES4借鉴。
|
| [] | ?() |
应用过滤表示式
|
| n/a | () |
脚本表达式,使用在脚本引擎下面。
|
| () | n/a | Xpath分组 |
- []在xpath表达式总是从前面的路径来操作数组,索引是从1开始。
- 使用JOSNPath的[]操作符操作一个对象或者数组,索引是从0开始。
- SONPath 例子
{ "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
}
}
}
| XPath | JSONPath | 结果 |
/store/book/author |
$.store.book[*].author |
书点所有书的作者
|
//author |
$..author |
所有的作者
|
/store/* |
$.store.* |
store的所有元素。所有的bookst和bicycle
|
/store//price |
$.store..price |
store里面所有东西的price
|
//book[3] |
$..book[2] |
第三个书
|
//book[last()] |
$..book[(@.length-1)] |
最后一本书 |
//book[position()<3] |
$..book[0,1]
$..book[:2] |
前面的两本书。 |
//book[isbn] |
$..book[?(@.isbn)] |
过滤出所有的包含isbn的书。 |
//book[price<10] |
$..book[?(@.price<10)] |
过滤出价格低于10的书。 |
//* |
$..* |
所有元素。
|
JSONPath 表达式的使用
一、JSONPath使用需要的包
-
<dependency>
-
<groupId>com.jayway.jsonpath</groupId>
-
<artifactId>json-path</artifactId>
-
<version>2.4.0</version>
-
</dependency>
二、使用说明
1、JSONPath是xpath在json的应用
2、JSONPath 是参照xpath表达式来解析xml文档的方式,json数据结构通常是匿名的并且不一定需要有根元素。
3、JSONPath 用一个抽象的名字$来表示最外层对象
4、JSONPath 允许使用通配符 * 表示所以的子元素名和数组索引
三、JSONPath表达式语法
JSONPath 表达式可以使用.符号解析json:
$.store.book[0].title
或者使用[]符号
$['store']['book'][0]['title']
四、测试实例
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,
-
"isbn": "0-553-21311-3"
-
}
-
],
-
"bicycle": {
-
"color": "red",
-
"price": 19.95
-
}
-
}
-
}
首先,读取json文件,使用commons.io的 FileUtils的readFileToString方法:
-
String path =System.getProperty("user.dir")+File.separator+"testdata"+File.separator+"test.json";
-
-
String jsonString = FileUtils.readFileToString(new File(path),"utf-8");
-
-
ReadContext context = JsonPath.parse(json);
其次,输出book[1]的author值。有两种方法:
方法一:
-
JsonPath.read(json,"$.store.book[1].author");
-
或
-
context.read("$.store.book[1].author");
-
输出:Evelyn Waugh
方法二:
-
JsonPath.read(json,"$['store']['book'][1]['author']");
-
context.read("$['store']['book'][1]['author']");
-
-
输出:Evelyn Waugh
//输出book[*]中category == 'reference'的book
-
List<Object> categorys = context.read("$.store.book[?(@.category == 'reference')]");
-
for(Object st: categorys){
-
System.out.println(st.toString());
-
}
-
输出: {category=reference, author=Nigel Rees, title=Sayings of the Century, price=8.95}
//输出book[*]中price>10的book
-
List<Object> prices = context.read("$.store.book[?(@.price>10)]");
-
for(Object p:prices){
-
System.out.println(p.toString());
-
}
-
输出:{category=fiction, author=Evelyn Waugh, title=Sword of Honour, price=12.99, isbn=0-553-21311-3}
//bicycle[*]中含有color元素的bicycle
-
List<Object> color = context.read("$.store.bicycle[?(@.color)]");
-
for(Object is :color){
-
System.out.println(is.toString());
-
}
-
输出://{color=red, price=19.95}
//输出该json中所有price的值
-
List<Object> pp = context.read("$..price");
-
for(Object p :pp){
-
System.out.println(p.toString());
-
}
-
输出: 8.95 12.99 19.95
-
-
List<String> authors = context.read("$.store.book[*].author");
-
for (String str : authors) {
-
System.out.println(str);
-
}
-
输出:Nigel Rees Evelyn Waugh
五、XPATH 和 JSONPath获取元素的方法比较
[]在xpath表达式总是从前面的路径来操作数组,索引是从1开始。
使用JOSNPath的[]操作符操作一个对象或者数组,索引是从0开始。

//输出book[0]的author值
String author = JsonPath.read(json, "$.store.book[0].author");
System.out.println("author\t"+author);
//输出全部author的值,使用Iterator迭代
List<String> authors = JsonPath.read(json, "$.store.book[*].author");
System.out.println("authors\t"+authors);
//输出book[*]中category == 'reference'的book
List<Object> books = JsonPath.read(json, "$.store.book[?(@.category == 'reference')]");
System.out.println("books\t"+books);
//输出book[*]中category == 'reference'的book或者
List<Object> books2 = JsonPath.read(json, "$.store.book[?(@.category == 'reference' || @.price>10)]");
System.out.println("books2\t"+books2);
//输出book[*]中category == 'reference'的book的author
List<Object> books1 = JsonPath.read(json, "$.store.book[?(@.category == 'reference')].author");
System.out.println("books1\t"+books1);
//输出book[*]中price>10的book
List<Object> b1 = JsonPath.read(json, "$.store.book[?(@.price>10)]");
System.out.println("b1"+b1);
//输出book[*]中含有isbn元素的book
List<Object> b2 = JsonPath.read(json, "$.store.book[?(@.isbn)]");
System.out.println("b2"+b2);
//输出该json中所有price的值
List<Double> prices = JsonPath.read(json, "$..price");
System.out.println("prices"+prices);
//输出该json中所有title的值
List<Double> title = JsonPath.read(json, "$..title");
System.out.println("title"+title);
//输出该json中book 0,1的值
List<Double> book01 = JsonPath.read(json, "$..book[0,1]");
System.out.println("book01"+book01);
/* //输出该json中book 0,1的值
List<Double> book012 = JsonPath.read(json, "$..book[-2:]");
System.out.println("book012"+book012);*/
//可以提前编辑一个路径,并多次使用它
JsonPath path = JsonPath.compile("$.store.book[*]");
List<Object> b3 = path.read(json);
System.out.println("path\t"+path+"\n"+b3);
原文地址:https://blog.csdn.net/myself8202/article/details/80724968
JSONPath-简单入门的更多相关文章
- 用IntelliJ IDEA创建Gradle项目简单入门
Gradle和Maven一样,是Java用得最多的构建工具之一,在Maven之前,解决jar包引用的问题真是令人抓狂,有了Maven后日子就好过起来了,而现在又有了Gradle,Maven有的功能它都 ...
- [原创]MYSQL的简单入门
MYSQL简单入门: 查询库名称:show databases; information_schema mysql test 2:创建库 create database 库名 DEFAULT CHAR ...
- Okio 1.9简单入门
Okio 1.9简单入门 Okio库是由square公司开发的,补充了java.io和java.nio的不足,更加方便,快速的访问.存储和处理你的数据.而OkHttp的底层也使用该库作为支持. 该库极 ...
- emacs最简单入门,只要10分钟
macs最简单入门,只要10分钟 windwiny @2013 无聊的时候又看到鼓吹emacs的文章,以前也有几次想尝试,结果都是玩不到10分钟就退出删除了. 这次硬着头皮,打开几篇文章都看完 ...
- 【java开发系列】—— spring简单入门示例
1 JDK安装 2 Struts2简单入门示例 前言 作为入门级的记录帖,没有过多的技术含量,简单的搭建配置框架而已.这次讲到spring,这个应该是SSH中的重量级框架,它主要包含两个内容:控制反转 ...
- Docker 简单入门
Docker 简单入门 http://blog.csdn.net/samxx8/article/details/38946737
- Springmvc整合tiles框架简单入门示例(maven)
Springmvc整合tiles框架简单入门示例(maven) 本教程基于Springmvc,spring mvc和maven怎么弄就不具体说了,这边就只简单说tiles框架的整合. 先贴上源码(免积 ...
- git简单入门
git简单入门 标签(空格分隔): git git是作为程序员必备的技能.在这里就不去介绍版本控制和git产生的历史了. 首先看看常用的git命令: git init git add git comm ...
- 程序员,一起玩转GitHub版本控制,超简单入门教程 干货2
本GitHub教程旨在能够帮助大家快速入门学习使用GitHub,进行版本控制.帮助大家摆脱命令行工具,简单快速的使用GitHub. 做全栈攻城狮-写代码也要读书,爱全栈,更爱生活. 更多原创教程请关注 ...
- Web---演示Servlet的相关类、表单多参数接收、文件上传简单入门
说明: Servlet的其他相关类: ServletConfig – 代表Servlet的初始化配置参数. ServletContext – 代表整个Web项目. ServletRequest – 代 ...
随机推荐
- Servlet小结(转载)
http://www.iteye.com/topic/766418 1 .首先,什么是Servlet? Servlet是一个Java编写的程序,此程序是在服务器端运行的,是按照Servl ...
- 2019-8-31-asp-dotnet-core-支持客户端上传文件
title author date CreateTime categories asp dotnet core 支持客户端上传文件 lindexi 2019-08-31 16:55:58 +0800 ...
- 封装好的PDO类
封装PDO类,方便使用: <?php header('content-type:text/html;charset=utf-8'); /** * 封装PDODB类 */ // 加载接口 // i ...
- 小爬爬4.协程基本用法&&多任务异步协程爬虫示例(大数据量)
1.测试学习 (2)单线程: from time import sleep import time def request(url): print('正在请求:',url) sleep() print ...
- 洛谷3067 BZOJ 2679题解(折半搜索)
传送门 BZOJ传送门(权限题) 看到n小于20,就可以想到搜索 所有的数要么在集合a中,要么在集合b中,要么都不在 可是3^n复杂度会炸,我们考虑优化 可以利用折半搜索,将前面一半的所有可能情况与后 ...
- MUI - 解决动态列表页图片懒加载再次加载不成功的bug
首先描述一下功能 实现列表页动态加载 通过官方提供的"下拉刷新和上拉刷新"及"图片懒加载"示例实现. http://www.cnblogs.com/philly ...
- celery琐碎笔记
-l 指定日志等级 -n 指定任务名称 -Q 指定任务执行队列 -c 指定启动celery的cpu数量 --logfile 指定日志输出到文件,会输出任务函数里的print,而控制台不会,用于调试. ...
- 关于IOS 微信浏览器 点击输入框自动放大问题
<meta name="viewport" content="width=device-width,initial-scale=1,user-scalable=0& ...
- 插入blob字段的简单方法
1. 按普通方法组织插入语句 ,f2为Blob型字段 insert into table (f1,f2,f3) values ('a',:para,'c') 2.对应每个blob型字段,OracleC ...
- js日期拓展方法
最近项目中使用了大量关于日期的操作遂将其整理如下: /** * 格式化日期 * @param {String} fmt [日期类型 默认为年月日(yyyy-MM-dd)] */ Date.protot ...