• 【原创】Jmeter正则表达式提取json中多个关联值


    使用jmeter时response中返回为json格式如下

    {
        "return_code": 0,
        "return_msg": "ok",
        "data": [
            {
                "name": "武汉隆安置业有限公司",
                "id": 4,
                "product": "[{"value":"7953AC76-A85A-E011-B371-001D096CF989","text":"\u9e7f\u9e23\u82d1"}]"
            },
            {
                "name": "湖北省建工房地产开发有限公司",
                "id": 10,
                "product": "[{"value":"8C53AC76-A85A-E011-B371-001D096CF989","text":"\u5f90\u4e1c\u96c5\u82d1"}]"
            }
        ]
    }
     

    需要将其中的"id": 4" id": 10,取出(4,10)用来后续断言,由于每次返回id的组数可能都不同,故无法使用$$模板号来取

    此时正则表达式匹配数字选择-1来匹配所有符合的关联值

    查看结果树时发现看不到所有id的值,通过添加后置处理器Debug PostProcessor查看提取的所有结果

    当前提取出的结果:

    custom_id_1=4
    custom_id_1_g=1
    custom_id_1_g0="id":4,"product"
    custom_id_1_g1=4
    custom_id_2=10
    custom_id_2_g=1
    custom_id_2_g0="id":10,"product"
    custom_id_2_g1=10
    custom_id_matchNr=2
     

     可以通过逻辑控制器-for each控制器逐一取出关联值

    并且赋值给数组tmp,其中${custom_id_matchNr}为匹配到的关联值个数

    最后打印验证下去取出的值是否正确

    4与10被成功取出,证明tmp即为最终需要的数组

    ================================================================================================================================================

    Jmeter正则实现探究:

    当前提取出的结果:

    custom_id_1=4
    custom_id_1_g=1
    custom_id_1_g0="id":4,"product"
    custom_id_1_g1=4
    custom_id_2=10
    custom_id_2_g=1
    custom_id_2_g0="id":10,"product"
    custom_id_2_g1=10
    custom_id_matchNr=2

    可以发现取出的内容并不只是一个数组

    下面还有分组 group1  group2

    查看源码实现

        private void saveGroups(MatchResult result, String namep, JMeterVariables vars) {
            if (result != null) {
                for (int x = 0; x < result.groups(); x++) {
                    vars.put(namep + "_g" + x, result.group(x)); //$NON-NLS-1$
                }
            }
        }
    List<MatchResult> collectAllMatches = new ArrayList<>();
            try {
                PatternMatcher matcher = JMeterUtils.getMatcher();
                PatternMatcherInput input = new PatternMatcherInput(textToMatch);
                while (matcher.contains(input, searchPattern)) {
                    MatchResult match = matcher.getMatch();
                    collectAllMatches.add(match);
                }
            } finally {
                if (name.length() > 0){
                    vars.put(name + "_matchNr", Integer.toString(collectAllMatches.size())); //$NON-NLS-1$
                }
            }
    
            if (collectAllMatches.size() == 0) {
                return defaultValue;
            }
    
            if (valueIndex.equals(ALL)) {
                StringBuilder value = new StringBuilder();
                Iterator<MatchResult> it = collectAllMatches.iterator();
                boolean first = true;
                while (it.hasNext()) {
                    if (!first) {
                        value.append(between);
                    } else {
                        first = false;
                    }
                    value.append(generateResult(it.next(), name, tmplt, vars));
                }
                return value.toString();
            } else if (valueIndex.equals(RAND)) {
                MatchResult result = collectAllMatches.get(ThreadLocalRandom.current().nextInt(collectAllMatches.size()));
                return generateResult(result, name, tmplt, vars);
            } else {
                try {
                    int index = Integer.parseInt(valueIndex) - 1;
                    MatchResult result = collectAllMatches.get(index);
                    return generateResult(result, name, tmplt, vars);
                } catch (NumberFormatException e) {
                    float ratio = Float.parseFloat(valueIndex);
                    MatchResult result = collectAllMatches
                            .get((int) (collectAllMatches.size() * ratio + .5) - 1);
                    return generateResult(result, name, tmplt, vars);
                } catch (IndexOutOfBoundsException e) {
                    return defaultValue;
                }
            }
    custom_id_1_g=1
    custom_id_2_g=1  // 代表group的长度
    custom_id_2_g0="id":10,"product"  //匹配的内容
    custom_id_2_g1=10  //提取的内容
  • 相关阅读:
    [NOI2002]银河英雄传说
    Splay普及版
    线段树普及版
    长连接与短连接
    【HTTP】中Get/Post请求区别
    【HTML】知识笔记
    SVN使用教程总结
    《人生只有一次,去做自己喜欢的事》读书笔记
    【HTTP】无状态无连接的含义
    【HTML】解析原理
  • 原文地址:https://www.cnblogs.com/maple42/p/6232297.html
Copyright © 2020-2023  润新知