extjs store 复杂json_ARTS Tips:Java中Json的利器JsonPath
发布日期:2021-06-24 11:37:25 浏览次数:3 分类:技术文章

本文共 3481 字,大约阅读时间需要 11 分钟。

接着上次的Json处理来讨论,层次较深的Json结构在Java代码中访问起来非常不便,层层定义JavaBean不说,写起代码起来要多敲不少按键,同时访问灵活度也不好。

其实有个叫json-path/JsonPath的开源java库专门用于解决这种问题,它的主要设计思路是模拟xpath来访问json字符串,拥有强大的访问逻辑和方法,可以用于快速处理json串,尤其是在读取的时候。细看这个库后,可以看到它其实是基于JSONPath这个规范。

JSONPath - XPath for JSON 不是一个正式的规范,是一名叫Stefan Goessner提出的访问Json串的规范,主要的思路就是借鉴XPATH来提供一套应用于JSON格式的方法,作者同时给出了jsphp的实现,从使用方法来看,这是一个很实用的规范。JSONPath和Xpath对应的基本访问方式定义对比如下

c265a64db1955203163efe69bbc683fa.png

用个官方的例子来解释一下

{
"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 } }}

下面是些常见的用法

503599d4f35cea0292c069a378b6cca9.png

除了可以快速访问以外,还有一个过滤的功能也相当实用,表格中倒数第二个、倒数第三个就是不错的例子。

了解完规范,我们回到Java版的json-path/JsonPath: Java JsonPath implementation ,这里赞一下kallestenflo,他这个库的设计和实现的非常好,远超我的预期,比官方的js实现也要完整的多,在java中方法非常较简单,首先添加依赖

com.jayway.jsonpath
json-path
2.4.0

具体用法如下

String json = "...";Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);List
authors = JsonPath.read(document, "$.store.book[*].author");String author0 = JsonPath.read(document, "$.store.book[0].author");String author1 = JsonPath.read(document, "$.store.book[1].author");// If you configure JsonPath to use JacksonMappingProvider or GsonMappingProvider you can even map your JsonPath output directly into POJO's.Book book = JsonPath.parse(json).read("$.store.book[0]", Book.class);// To obtain full generics type information, use TypeRef.TypeRef
> typeRef = new TypeRef
>() {};List
titles = JsonPath.parse(JSON_DOCUMENT).read("$.store.book[*].title", typeRef);

fluent风格的API如下

String json = "...";ReadContext ctx = JsonPath.parse(json);List
authorsOfBooksWithISBN = ctx.read("$.store.book[?(@.isbn)].author");List
> expensiveBooks = JsonPath .using(configuration) .parse(json) .read("$.store.book[?(@.price > 10)]", List.class);

Java版本还提供一些实用功能:

  • 支持Gson、Jackson
  • 有一些内置的函数和专用的过滤操作符
  • 基于JsonPath可以快速赋值 String newJson = JsonPath.parse(json).set("$['store']['book'][0]['author']", "Paul").jsonString();
  • 查询出来的json串,可以直接做JavaBean类型转换,这里还支持范型
  • Inline Predicates嵌入式谓词:可以在表达式中直接完成组合式的过滤条件
  • Filter Predicates自定义条件过滤谓词:这里可以定制专有的过滤谓词,可以组合实现非常复杂的过滤条件
  • 支持cache

这个库的还有一个比较有用的地方是在爬虫中处理得到的数据,在爬取数据的过程中,服务端的API每个都对应实现一套JavaBean,必要性也不是很强,这个时候就很适合发挥作用。

再补充一下,在Java里生成Json串的话,最基本的方法是用JavaBean序列化,不过还有些其它办法,这里提到了一种快速的方法,如果格式比较固定,其实用一个模板语言来生成Json串也比较实用,主要的优势是比较直观。另外一个思路就是先生成Map对象,然后把这个Map转化为Json字符串,这个有一堆的库可以实现。

最后总结一下,在java中想要轻松愉快的和Json打交道,有不少方法可以尝试,这些方法是借鉴自其它语言或领域,再转化为java专用的工具之后,也足够好用,关键在于使用者的工具箱里有没有这些工具。

Reference

  • json-path/JsonPath: Java JsonPath implementation
  • jsonpath online evaluator
  • JSONPath - XPath for JSON
  • JSON JSONPath – REST API Tutorial
  • Introduction to JsonPath | Baeldung
  • jsonpath - npm

转载地址:https://blog.csdn.net/weixin_32552195/article/details/112408079 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:ddr4服务器内存和普通内存_长鑫存储DDR4/LPDDR4x内存芯片、DDR4内存条开始接单了...
下一篇:java配置d盘绝对路径_Java开发环境安装配置,这些小技能,你get到了吗?

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2024年04月17日 05时23分20秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

【英语学习】【Level 08】U02 Movie Time L4 From the page to the big screen 2019-04-28
【英语学习】【Level 08】U02 Movie Time L5 Art in motion 2019-04-28
【英语学习】【Level 08】U02 Movie Time L6 Blockbuster 2019-04-28
【英语学习】【Level 08】U03 My Choice L1 Good books are like good friends 2019-04-28
【英语学习】【Level 08】U03 My Choice L2 All-time favorite character 2019-04-28
【英语学习】【Level 08】U03 My Choice L3 Let's go to the movies 2019-04-28
【英语学习】【Level 08】U03 My Choice L4 The coolest movie character 2019-04-28
【英语学习】【Level 08】U03 My Choice L5 The star that shines the brightest 2019-04-28
【英语学习】【Level 08】U03 My Choice L6 Stories that make an impact 2019-04-28
【英语学习】【Level 08】U04 What I love L1 What's on your playlist? 2019-04-28
【英语学习】【Level 08】U04 What I love L2 My favorite sport 2019-04-28
【英语学习】【Level 08】U04 What I love L3 A good buy 2019-04-28
【英语学习】【Level 08】U04 What I love L4 Take your sweet time 2019-04-28
【英语学习】【Level 08】U04 What I love L5 Breathe in, breathe out 2019-04-28
【Python】理解Python(1) - Python数据模型,is关键字,类型 2019-04-28
【Python】理解Python(2) - help() 函数? or 类? 2019-04-28
【英语学习】【Level 08】U04 What I love L6 Information overload 2019-04-28
【英语学习】【Level 08】U05 Better option L1 Message sent 2019-04-28
【英语学习】【Level 08】U05 Better option L2 Online shopping 2019-04-28
【英语学习】【Level 08】U05 Better option L3 Everything's a click away 2019-04-28