最近接触一个项目,该项目是完全通过动态配置化管理,涉及到很多不规范的json配置,但是要动态解析就很麻烦!看到项目是通过一个 jsonPath 的工具来做的, 所以简单带大家入个门。
背景介绍:
这个是GitHub的项目官网:点击这里
<dependency>
<groupId>com.jayway.jsonpath</groupId>
<artifactId>json-path</artifactId>
<version>x.y.z</version>
</dependency>
JsonPath可以操作json字符串数据,省去了使用正则匹配的麻烦!绝对是个好东西, 发现网上做爬虫,或者测试时候用它解析数据较多。 其实场景根据实际业务需求可以使用。
简单入门:
| 操作符 | 描述 |
|---|---|
| $ | 要查询的根元素。这将启动所有路径表达式。 |
| @ | 过滤谓词正在处理的当前节点。 |
| * | 通配符。可在任何需要名称或数字的地方使用。 |
| .. | 深层扫描。可在任何需要名称的地方使用。 |
| . | 带点符号的孩子 |
| [' | 括号标记的孩子或孩子 |
| [ | 数组索引或索引 |
| [start:end] | 数组切片运算符 含头不含尾巴 |
| [?( | 过滤表达式。表达式必须计算为布尔值。 |
Simple Json Example:
{
"list":[
{
"name":"小明"
},
{
"name":"小白"
},
{
"name":"小黑"
}
],
"age":18,
"ext":"好好学习"
}
简单解释下:
| Operator | Description |
|---|---|
| == | 左边等于右边 |
| != | 左边不等于右边 |
| < | 左边小于右边 |
| <= | 左边小于等于右边 |
| > | 左边大于右边 |
| >= | 左边大于等于右边 |
| =~ | 左边匹配正则表达式 [?(@.name =~ /foo.*?/i)] |
其实还有几个 这里没有全部列出来, 大家可以看上面链接比较详细。
实战模拟:
这里模拟一份订单数据 包含订单本身信息 , 商品列表信息 , 用户信息。
{
"goodsList":[
{
"name":"苹果定制土豪金 1T 全网通",
"price":12990,
"ref":"定制苹果"
},
{
"name":"LG 100寸 超级智能电视",
"price":88000,
"ref":"电视"
},
{
"name":"拯救者 游戏电脑",
"price":57120,
"ref":"笔记本"
}
],
"id":110,
"orderNo":"20200808",
"user":{
"address":"上海天地一号",
"age":30,
"name":"王思聪"
}
}
如何使用呢?
1 获取其中 orderNo 值:
$ 代表当前Json根, 通过.<name>
String json = '...';
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
Object read = JsonPath.read(document, "$.orderNo");

2 获取user下的age 既可以写成['user']['age']
String json = '...';
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
Object read1 = JsonPath.read(document, "$['user']['age']");

3 子层级下面所有的name数据 这种用的比较少
String json = genJson();
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
Object read2 = JsonPath.read(document, "$..name");

4 获取数组中的指定索引元素
String json = genJson();
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
Object read3 = JsonPath.read(document, "$.goodsList[0,1].['name', 'price']");

5 获取数组 根据范围匹配 [start:end] 含头不含尾
String json = genJson();
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
Object read3_1 = JsonPath.read(document, "$.goodsList[0:1].['name', 'price']"); //含头不含尾巴

6 获取子元素中指定的多个不同的元素
通过[
String json = "...";
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
Object read3_1 = JsonPath.read(document, "$.goodsList[0:1].['name', 'price']"); //含头不含尾巴

7 过滤json中的数据 获取想要的数据 其中 @ 元素 表示当前层级
String json = "...";
Object document = Configuration.defaultConfiguration().jsonProvider().parse(json);
Object read4 = JsonPath.read(document, "$.goodsList[?(@.price > 50000)].['name', 'price']");
可以看到过滤价格小于5w的数据。
总结:
通过如上操作 可以知道jsonPath常见用法。大家可以使用这个解决一些开发中问题。其中还有一些函数使用没有讲,大家可以看下官网文档,大家有需要可以学习下!
这里再推荐一个测试使用网站

文章转载自OfNull,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




