前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >JsonPath工具类封装

JsonPath工具类封装

作者头像
FunTester
发布2020-09-08 10:04:47
1.7K0
发布2020-09-08 10:04:47
举报
文章被收录于专栏:FunTester

书接上文和上上文:

  • JsonPath实践(一)
  • JsonPath实践(二)
  • JsonPath实践(三)
  • JsonPath实践(四)
  • JsonPath实践(五)
  • JsonPath实践(六)

在经历过一些波折之后,总算是把JsonPath工具类的封装类写好了,时间仓促。没有太严格的测试,等有机会我再用Groovy进行单元测试框架spock写一些单测来验证一下。

工具类的语言Groovy,有点不必多说了,相信使用Java技术栈的同学读起来应该不会有障碍。另外我把官方的API当做类注释写出来了。

有两个关于verify类的方法,这个主要是为了验证用的,涉及到Groovy重载操作符,是专门写的一个提供给Groovy脚本的验证功能类,还有就是为开源测试服务增加功能储备。

代码如下:

代码语言:javascript
复制
package com.fun.utils

import com.alibaba.fastjson.JSONObject
import com.fun.base.exception.ParamException
import com.fun.frame.SourceCode
import com.jayway.jsonpath.JsonPath
import com.jayway.jsonpath.JsonPathException
import org.slf4j.Logger
import org.slf4j.LoggerFactory

/**下面是例子,官方文档地址:https://github.com/json-path/JsonPath/blob/master/README.md
 * $.store.book[*].author The authors of all books
 * $..author All authors
 * $.store.* All things, both books and bicycles
 * $.store..price The price of everything
 * $..book[2] The third book
 * $..book[-2] The second to last book
 * $..book[0,1] The first two books
 * $..book[:2] All books from index 0 (inclusive) until index 2 (exclusive)
 * $..book[1:2] All books from index 1 (inclusive) until index 2 (exclusive)
 * $..book[-2:] Last two books
 * $..book[2:] Book number two from tail
 * $..book[?(@.isbn)] All books with an ISBN number
 * $.store.book[?(@.price < 10)] All books in store cheaper than 10
 * $..book[?(@.price <= $['expensive'])] All books in store that are not "expensive"
 * $..book[?(@.author =~ /.*REES/i)] All books matching regex (ignore case)
 * $..* Give me every thing
 * $..book.length() The number of books
 *
 *
 * min() Provides the min value of an array of numbers Double
 * max() Provides the max value of an array of numbers Double
 * avg() Provides the average value of an array of numbers Double
 * stddev() Provides the standard deviation value of an array of numbers Double
 * length() Provides the length of an array Integer
 * sum() Provides the sum value of an array of numbers Double
 * min() 最小值 Double
 * max() 最大值 Double
 * avg() 平均值 Double
 * stddev() 标准差 Double
 * length() 数组长度 Integer
 * sum() 数组之和 Double
 * == left is equal to right (note that 1 is not equal to '1')
 * != left is not equal to right
 * < left is less than right
 * <= left is less or equal to right
 * > left is greater than right
 * >= left is greater than or equal to right
 * =~ left matches regular expression [?(@.name =~ /foo.*?/i)]
 * in left exists in right [?(@.size in ['S', 'M'])]
 * nin left does not exists in right
 * subsetof 子集 [?(@.sizes subsetof ['S', 'M', 'L'])]
 * anyof left has an intersection with right [?(@.sizes anyof ['M', 'L'])]
 * noneof left has no intersection with right [?(@.sizes noneof ['M', 'L'])]
 * size size of left (array or string) should match right
 * empty left (array or string) should be empty
 */
class JsonUtil extends SourceCode {

    private static Logger logger = LoggerFactory.getLogger(JsonUtil.class)

    /**
     * 用户构建对象,获取verify对象
     */
    private JSONObject json

    private JsonUtil(JSONObject json) {
        this.json = json
    }

    static JsonUtil getInstance(JSONObject json) {
        new JsonUtil(json)
    }

    Verify getVerify(String path) {
        Verify.getInstance(this.json, path)
    }

    /**
     * 获取string对象
     * @param path
     * @return
     */
    String getString(String path) {
        def object = get(path)
        object == null ? EMPTY : object.toString()
    }


    /**
     * 获取int类型
     * @param path
     * @return
     */
    int getInt(String path) {
        changeStringToInt(getString(path))
    }

    /**
     * 获取boolean类型
     * @param path
     * @return
     */
    int getBoolean(String path) {
        changeStringToBoolean(getString(path))
    }

    /**
     * 获取long类型
     * @param path
     * @return
     */
    int getLong(String path) {
        changeStringToLong(getString(path))
    }
    
    /**
     * 获取double类型
     * @param path
     * @return
     */
    double getDouble(String path) {
        changeStringToDouble(getString(path))
    }

    /**
     * 获取list对象
     * @param path
     * @return
     */
    List getList(String path) {
        get(path) as List
    }

    /**
     * 获取匹配对象,类型传参
     * 这里不加public  IDE会报错
     * @param path
     * @param tClass
     * @return
     */
    public <T> T getT(String path, Class<T> tClass) {
        try {
            get(path) as T
        } catch (ClassCastException e) {
            logger.warn("类型转换失败!", e)
            null
        }
    }

    /**
     * 获取匹配对象
     * @param path
     * @return
     */
    Object get(String path) {
        logger.debug("匹配对象:{},表达式:{}", json.toString(), path)
        if (json == null || json.isEmpty()) ParamException.fail("json为空或者null,参数错误!")
        try {
            JsonPath.read(this.json, path)
        } catch (JsonPathException e) {
            logger.warn("jsonpath:{}解析失败,json值", json.toString(), path, e)
            null
        }
    }


}
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-08-31,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 FunTester 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
测试服务
测试服务 WeTest 包括标准兼容测试、专家兼容测试、手游安全测试、远程调试等多款产品,服务于海量腾讯精品游戏,涵盖兼容测试、压力测试、性能测试、安全测试、远程调试等多个方向,立体化安全防护体系,保卫您的信息安全。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档