JSONPath入门及测试
JSONPath入门
JSONPath - 是xpath在json的应用,是参照xpath表达式来解析XML文档的方式。JSONPath用'$'来表示最外层对象
XPath的表达式:
/store/book[1]/title
x.store.book[0].title
x['store']['book'][0]['title']
JSONPath的表达式:
$.store.book[0].title
$['store']['book'][0]['title']
JSONPath可以使用通配符*表示所有的子元素名和数组索引,使用'@'来表示当前对象,?(<判断表达式>)使用逻辑表达式来过滤。
eg: $.store.book[?(@.price<10)].title
XPath和JSONPath的不同点:
· []在xpath表达式总是从前面的路径来操作数组,索引是从1开始。
· 使用JSONPath的[]操作符操作一个对象或数组,索引是从0开始。
XPathJSONPathDescription
/$表示根元素
.@ 当前元素
/. or []子元素
..n/a父元素
//..递归下降,JSONPath是从E4X借鉴的。
**通配符,表示所有的元素
@n/a 属性访问字符
[][]子元素操作符
|[,]连接操作符在XPath 结果合并其它结点集合。JSONP允许name或者数组索引。
n/a[start:end:step]数组分割操作从ES4借鉴。
[]?()应用过滤表示式
n/a()脚本表达式,使用在脚本引擎下面。
()n/aXpath分组
eg:
{
"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
}
XPath JSONPath
//* $..* 所有元素
//book[isbn] $..book[?(@.isbn)] 过滤出所有的包含isbn的书
//book[price<10] $..book[?(@.price<10)] 过滤出价格低于10的书
//book[3] $..book[2] 第三个书
//book[last()] $..book[(@.length-1)] 最后一本书
//author $..author 所有的作者
/store/* $.store.* store 的所有元素
/store/book/author $.store.book[*].author 所有书的作者
//book[position()<3] $..book[0,1]/$..book[:2] 前面的两本书
1、author=Evelyn Waugh
$..book[1].author
2、color = red
$..bicycle.color
3、expensive = 10
$.expensive
4、获取"author":"J.R.R.Tolkien"的price
$..book[?(@.author=='J. R. R. Tolkien')].price
创建maven项目测试一下:
1、POM里导入:
<!-- jsonpath jar包 -->
<groupId>com.jayway.jsonpath
<artifactId>json-path
<version>2.4.0
<groupId>org.apache.commons
<artifactId>commons-io
<version>1.3.2
<groupId>org.slf4j
<artifactId>slf4j-nop
<version>1.7.2
</dependencies>
2、将上面例子中的json保存为json文件放到resources
3、执行如下代码:
import com.jayway.jsonpath.JsonPath;
import org.apache.commons.io.FileUtils;
import java.io.File;
import java.io.IOException;
import java.util.List;
public class jspath {
public static void main(String[] args)throws IOException {
File file =new File(jspath.class.getClassLoader().getResource("a.json").getPath());
String json = FileUtils.readFileToString(file);
List authors = JsonPath.read(json, "$..bicycle[?(@.color=='red')]"); // 修改JSONPath的内容测试结果是否一致
System.out.println(authors);
}
}