java jsonpath例子_JSONPath-简单入门

JSONPath - 是xpath在json的应用。

xml最大的优点就有大量的工具可以分析,转换,和选择性的提取文档中的数据。XPath是这些最强大的工具之一。

如果可以使用xpath来解析json,以下的问题可以被解决:

1,数据不使用特殊的脚本,可以在客户端交互的发现并取并获取。

2,客户机请求的JSON数据可以减少到服务器上的相关部分,这样可以最大限度地减少服务器响应的带宽使用率。

如果我们愿意,这个可以解析json数据的工具会变得有意义。随之而来的问题是它如何工作,jsonpath的表达式看起来怎么样。

事实上,json是由c系统编程语言表示自然数据,有特定语言的特定语法来访问json数据。

xpath的表达式:

/store/book[1]/title

我们可以看作是:

x.store.book[0].title

x['store']['book'][0]['title']

在Javascript, Python 和 PHP 中一个变量x表示json数据。经过观察,特定的语言里有内置xpath来解析数据。

JSONPath工具的问题

-依赖某种特定的语言

- 需要依赖XPath 1.0

- 减少代码量和内存的消耗

- 在运行时

JSONPath 表达式

JSONPath 是参照,xpath表达式来解析xml文档的方式,json数据结构通常是匿名的并且不一定需要有根元素。JSONPaht 用一个抽象的名字$来表示最外层对象。

JOSNPath 表达式可以使用.  符号如下:

$.store.book[0].title

或者使用[] 符号

$['store']['book'][0]['title']

从输入路径来看。内部或者输出的路径都会转化成-符号。

JSONPath 允许使用通配符 * 表示所以的子元素名和数组索引。还允许使用 '..' 从E4X参照过来的和数组切分语法[start:end:step]是从ECMASCRIPT 4 参照过来的。

表达式在下面的脚本语言中可以使用显示的名称或者索引:

$.store.book[(@.length-1)].title

使用'@'符号表示当前的对象,?() 使用逻辑表达式来过滤。

$.store.book[?(@.price < 10)].title

这里有个表格,说明JSONPath语法元素和对应XPath元素的对比。

XPathJSONPathDescription

/$表示根元素

.@当前元素

/. or []子元素

..n/a父元素

//..递归下降,JSONPath是从E4X借鉴的。

**通配符,表示所有的元素

@n/a属性访问字符

[][]子元素操作符

|[,]连接操作符在XPath 结果合并其它结点集合。JSONP允许name或者数组索引。

n/a[start:end:step]数组分割操作从ES4借鉴。

[]?()应用过滤表示式

n/a()脚本表达式,使用在脚本引擎下面。

()n/aXpath分组

XPath还有很多的语法(本地路径,操作符,和函数)没有列在这里。只要知道xpath和jsonpath脚本之中的不同点就行了。[]在xpath表达式总是从前面的路径来操作数组,索引是从1开始。

使用JOSNPath的[]操作符操作一个对象或者数组,索引是从0开始。

SONPath 例子

接下我们看jsonpath表示的例子。下面是一个简单的json数据结构代表一个书店(原始的xml文件是){ "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

}

}

}

XPathJSONPath结果

/store/book/author$.store.book[*].author书点所有书的作者

//author$..author所有的作者

/store/*$.store.*store的所有元素。所有的bookst和bicycle

/store//price$.store..pricestore里面所有东西的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使用需要的包

com.jayway.jsonpath

json-path

2.4.0

二、使用说明

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'的bookList 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的bookList 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元素的bicycleList color = context.read("$.store.bicycle[?(@.color)]");

for(Object is :color){

System.out.println(is.toString());

}

输出://{color=red, price=19.95}

//输出该json中所有price的值List pp = context.read("$..price");

for(Object p :pp){

System.out.println(p.toString());

}

输出: 8.95 12.99 19.95

List authors = context.read("$.store.book[*].author");

for (String str : authors) {

System.out.println(str);

}

输出:Nigel Rees Evelyn Waugh

五、XPATH 和 JSONPath获取元素的方法比较

[]在xpath表达式总是从前面的路径来操作数组,索引是从1开始。

使用JOSNPath的[]操作符操作一个对象或者数组,索引是从0开始。

702a4044af9254e9693c44c8454b8480.png

//输出book[0]的author值

String author = JsonPath.read(json, "$.store.book[0].author");

System.out.println("author\t"+author);

//输出全部author的值,使用Iterator迭代

List authors = JsonPath.read(json, "$.store.book[*].author");

System.out.println("authors\t"+authors);

//输出book[*]中category == 'reference'的book

List books = JsonPath.read(json, "$.store.book[?(@.category == 'reference')]");

System.out.println("books\t"+books);

//输出book[*]中category == 'reference'的book或者

List books2 = JsonPath.read(json, "$.store.book[?(@.category == 'reference' || @.price>10)]");

System.out.println("books2\t"+books2);

//输出book[*]中category == 'reference'的book的author

List books1 = JsonPath.read(json, "$.store.book[?(@.category == 'reference')].author");

System.out.println("books1\t"+books1);

//输出book[*]中price>10的book

List b1 = JsonPath.read(json, "$.store.book[?(@.price>10)]");

System.out.println("b1"+b1);

//输出book[*]中含有isbn元素的book

List b2 = JsonPath.read(json, "$.store.book[?(@.isbn)]");

System.out.println("b2"+b2);

//输出该json中所有price的值

List prices = JsonPath.read(json, "$..price");

System.out.println("prices"+prices);

//输出该json中所有title的值

List title = JsonPath.read(json, "$..title");

System.out.println("title"+title);

//输出该json中book 0,1的值

List book01 = JsonPath.read(json, "$..book[0,1]");

System.out.println("book01"+book01);

/* //输出该json中book 0,1的值

List book012 = JsonPath.read(json, "$..book[-2:]");

System.out.println("book012"+book012);*/

//可以提前编辑一个路径,并多次使用它

JsonPath path = JsonPath.compile("$.store.book[*]");

List b3 = path.read(json);

System.out.println("path\t"+path+"\n"+b3);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值