• JsonPath工具类封装


    书接上文和上上文:

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

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

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

    代码如下:

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

    • 公众号FunTester首发,更多原创文章:460+原创文章,欢迎关注、交流,禁止第三方擅自转载。

    热文精选

  • 相关阅读:
    谈谈我对雾霾的看法
    2016年书单分享
    我的面试心得:面试官视角
    Cesium原理篇:GroundPrimitive
    Cesium原理篇:Batch
    Peter Hessler和他的中国三部曲(上)
    Cesium原理篇:Material
    全球PM25实时可视化
    Cesium原理篇:Property
    次郎的寿司梦
  • 原文地址:https://www.cnblogs.com/FunTester/p/13595912.html
Copyright © 2020-2023  润新知