使⽤JSONPath解析JSON完整内容详解
使⽤ JSONPath 解析 JSON 完整内容详解
jsonpath的介绍:
JsonPath是⼀种简单的⽅法来提取给定JSON⽂档的部分内容。 JsonPath有许多编程语⾔,如Javascript,Python和PHP,Java。
JsonPath提供的json解析⾮常强⼤,它提供了类似正则表达式的语法,基本上可以满⾜所有你想要获得的json内容。
JsonPath可在Central Maven存储库中到。 Maven⽤户将其添加到您的POM:
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>2.2.0</version>
</dependency>
JsonPath表达式总是以与XPath表达式结合使⽤XML⽂档相同的⽅式引⽤JSON结构。
JsonPath中的“根成员对象”始终称为$,⽆论是对象还是数组。
JsonPath表达式可以使⽤点表⽰法
$.store.book [0].title
或括号表⽰法
$['store']['book'][0]['title']
jsonpath操作符:
操作 说明
$ 查询根元素。这将启动所有路径表达式。
@ 当前节点由过滤谓词处理。
报价表单大师
* 通配符,必要时可⽤任何地⽅的名称或数字。
.. 深层扫描。必要时在任何地⽅可以使⽤名称。
.<name>
点,表⽰⼦节点
['<name>' (, '<name>')]
括号表⽰⼦项
[<number> (, <number>)]
数组索引或索引
[start:end]
数组切⽚操作
[?(<expression>)] 过滤表达式。表达式必须求值为⼀个布尔值。
函数
函数可以在路径的尾部调⽤,函数的输出是路径表达式的输出,该函数的输出是由函数本⾝所决定的。
函数 描述 输出
min() 提供数字数组的最⼩值 Double
max() 提供数字数组的最⼤值 Double
avg() 提供数字数组的平均值 Double
stddev() 提供数字数组的标准偏差值 Double
length() 提供数组的长度 Integer
过滤器运算符
过滤器是⽤于筛选数组的逻辑表达式。⼀个典型的过滤器将是[?(@.age > 18)],其中@表⽰正在处理的当前项⽬。 可以使⽤逻辑运算符&&和||创建更复杂的过滤器。 字符串⽂字必须⽤单引号或双引号括
起来([?(@.color == ‘blue’)] 或者 [?(@.color == “blue”)]).
操作符 描述
== left等于right(注意1不等于'1')
!= 不等于
< ⼩于
<= ⼩于等于
> ⼤于
>= ⼤于等于
=~ 匹配正则表达式[?(@.name =~ /foo.*?/i)] in 左边存在于右边 [?(@.size in ['S', 'M'])] nin 左边不存在于右边
size (数组或字符串)长度
empty (数组或字符串)为空
接下来我们就⽤java代码来写⼀个案例:
Java操作⽰例
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
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
python请求并解析json数据"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
}
JsonPath (点击链接测试) 结果
$.store.book[*].author 获取json中store下book下的所有author值
$..author 获取所有json中所有author的值
$.store.* 所有的东西,书籍和⾃⾏车
$.store..price 获取json中store下所有price的值
$..book[2] 获取json中book数组的第3个值
$..book[-2] 倒数的第⼆本书
$..book[0,1] 前两本书
$..book[:2] 从索引0(包括)到索引2(排除)的所有图书
$..book[1:2] 从索引1(包括)到索引2(排除)的所有图书
$..book[-2:] 获取json中book数组的最后两个值
$..book[2:] 获取json中book数组的第3个到最后⼀个的区间值
$..book[?(@.isbn)] 获取json中book数组中包含isbn的所有值
$.store.book[?(@.price < 10)] 获取json中book数组中price<10的所有值
$..book[?(@.price <= $['expensive'])] 获取json中book数组中price<=expensive的所有值
$..book[?(@.author =~ /.*REES/i)] 获取json中book数组中的作者以REES结尾的所有值(REES不区分⼤⼩写)
$..* 逐层列出json中的所有值,层级由外到内
$..book.length() 获取json中book数组的长度
上⾯的json字符串的读取案例:
(1)
String json = "...";
List<String> authors = ad(json, "$.store.book[*].author");
(2)
如果你只想读取⼀次,那么上⾯的代码就可以了
如果你还想读取其他路径,现在上⾯不是很好的⽅法,因为他每次获取都需要再解析整个⽂档。所以,我们可以先解析整个⽂档,再选择调⽤路径。
String json = "...";
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
String author0 = ad(document, "$.store.book[0].author");
String author1 = ad(document, "$.store.book[1].author");
(3)
当在java中使⽤JsonPath时,重要的是要知道你在结果中期望什么类型。 JsonPath将⾃动尝试将结果转换为调⽤者预期的类型。
// 抛出 java.lang.ClassCastException 异常
List<String> list = JsonPath.parse(json).read("$.store.book[0].author")
// 正常
String author = JsonPath.parse(json).read("$.store.book[0].author")
(4)
默认情况下,MappingProvider SPI提供了⼀个简单的对象映射器。 这允许您指定所需的返回类型,MappingProvider将尝试执⾏映射。在下⾯的⽰例中,演⽰了Long和Date之间的映射。
String json = "{\"date_as_long\" : 1411455611975}";
Date date = JsonPath.parse(json).read("$['date_as_long']", Date.class);
(5)
如果您将JsonPath配置为使⽤JacksonMappingProvider或GsonMappingProvider,您甚⾄可以将JsonPath输出直接映射到POJO 中。
Book book = JsonPath.parse(json).read("$.store.book[0]", Book.class);
另外⼀个案例:
{ "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,
svn如何使用教程"isbn": "0-553-21311-3"
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
private static void jsonPathTest() {
JSONObject json = jsonTest();//调⽤⾃定义的jsonTest()⽅法获得json对象,⽣成上⾯的json
javascript百炼成仙网盘资源//输出book[0]的author值
计算器xor什么意思String author = ad(json, "$.store.book[0].author");
//输出全部author的值,使⽤Iterator迭代
List<String> authors = ad(json, "$.store.book[*].author");
//输出book[*]中category == 'reference'的book
List<Object> books = ad(json, "$.store.book[?(@.category == 'reference')]"); //输出book[*]中price>10的book
List<Object> books = ad(json, "$.store.book[?(@.price>10)]");
//输出book[*]中含有isbn元素的book
List<Object> books = ad(json, "$.store.book[?(@.isbn)]");
//输出该json中所有price的值
List<Double> prices = ad(json, "$..price");
//可以提前编辑⼀个路径,并多次使⽤它
JsonPath path = JsonPathpile("$.store.book[*]");
List<Object> books = ad(json);
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论