暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Json解析器之JsonPath

OfNull 2021-09-05
1555

最近接触一个项目,该项目是完全通过动态配置化管理,涉及到很多不规范的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":"好好学习"
}


简单解释下:其实就代表Json的字段名 举例:上面 age表示过滤表达式 需要配合@和比较符号使用。后面教你怎么json中自己想要的数据。


OperatorDescription
==左边等于右边
!=左边不等于右边
<左边小于右边
<=左边小于等于右边
>左边大于右边
>=左边大于等于右边
=~左边匹配正则表达式 [?(@.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");

image.png

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']");

image.png

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常见用法。大家可以使用这个解决一些开发中问题。其中还有一些函数使用没有讲,大家可以看下官网文档,大家有需要可以学习下!

这里再推荐一个测试使用网站

image.png


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

评论