首页 > 解决方案 > 如何在不使用波浪号的情况下仅获取 JSON 密钥?

问题描述

我试图(通过 JSON 路径)仅从下面的 JSON 中获取键值,但没有成功。

我不能使用波浪号 (~),因为 JMeter 的JSON 路径提取器在 JSON PATH 4.0 下工作并且 ~ 无法识别。

{
    "facetCount": {
        "designer": {
            "4856430": 2,
            "7313551": 14,
            "7018102": 8,
            "306838": 1,
            "85146": 146,
            "2654979": 11,
            "221111": 4,
            "180510": 40,
            "3344622": 59,
            "472718": 73,
            "107993": 19,
            "166170": 58,
            "6908": 2,
            "426629": 1,
            "1358858": 9,
            "9879178": 6,
            "55006": 43,
            "285396": 2,
            "3355": 9,
            "215501": 8,
            "4968477": 4,
            "11349629": 7,
            "11229643": 27,
            "11355128": 9,
            "7093068": 3,
            "11098281": 2,
            "5833751": 1,
            "4741301": 1,
            "9198104": 21,
            "991324": 4
        },
        "attributes": {
            "135979:77": 290,
            "135979:83": 27,
            "136227:20": 141,
            "136227:78": 670,
            "135985:44": 123,
            "135985:43": 669,
            "135979:62": 700,
            "135979:61": 1188,
            "136644:176": 2,
            "136331:7": 1,
            "136331:8": 3,
            "136641:190": 13,
            "136641:191": 12,
            "136061:144": 3
        },
        "category": {
            "136103": 208,
            "136105": 147,
            "137322": 2,
            "136389": 120,
            "136215": 236,
            "136214": 954,
            "136216": 217,
            "136217": 352,
            "136218": 452,
            "136219": 40,
            "136480": 4,
            "136220": 111,
            "136221": 288,
            "136222": 58,
            "136223": 369,
            "136224": 163,
            "136986": 3,
            "136307": 1125,
            "136059": 10,
            "136308": 956,
            "136315": 984,
            "136003": 574,
            "136045": 267,
            "136035": 1501,
            "135985": 1380,
            "137134": 27,
            "136309": 60,
            "137323": 9,
            "136390": 1,
            "136021": 16,
            "136322": 1951,
            "137166": 16,
            "137317": 7,
            "136005": 4,
            "135983": 4019,
            "136033": 1513,
            "136310": 1224,
            "136392": 18,
            "135981": 2430,
            "136031": 16,
            "136326": 1312,
            "136061": 79
        },
        "colour": {
            "1": 41686,
            "7": 14593,
            "5": 9596,
            "18": 1,
            "13": 5185,
            "6": 5259,
            "3": 6391,
            "11": 5715,
            "12": 1537,
            "4": 8767,
            "16": 1466,
            "9": 8590,
            "15": 1730,
            "8": 8333,
            "14": 3208,
            "2": 13269,
            "10": 2730
        },
        "ninetyminutes": {
            "3": 309
        },
        "sameday": {
            "3": 1714,
            "42": 254
        },
        "size": {
            "135972:1620": 523,
            "136657:2650": 1,
            "136657:2850": 1
        },
        "location": {
            "3": 2674,
            "4": 7671,
            "5": 35808,
            "6": 2761,
            "7": 11948
        },
        "labels": {
            "1300": 2969
        }
    }
}

我想获取facetCount元素下的(设计器、属性、颜色等)以及(另一个 JSON 路径表达式)获取这些键内的键,例如来自设计师的4856430,来自属性的135979:77, 等等。

请问你能帮帮我吗?

提前致谢!

标签: jsonjmeterjmeter-pluginsjsonpathjmeter-5.0

解决方案


JMeter 的 JSON 测试元素依赖于Jayway Jsonpath,它没有这个波浪号运算符来查询键,你必须去:

添加 JSR223 PostProcessor 作为返回上述 JSON 的请求的子级,并使用以下代码:

  1. 对于直接键(设计器、属性等)

    def counter = 1
    new groovy.json.JsonSlurper().parse(prev.getResponseData()).facetCount.each { facet ->
        vars.put('key_' + counter, facet.key)
        counter++
    }
    vars.put('key_matchNr', counter - 1 as String)
    
  2. 对于子键(4856430、135979:77 等)

    def counter = 1
    new groovy.json.JsonSlurper().parse(prev.getResponseData()).facetCount.each { child ->
        child.value.keySet().each { key ->
            vars.put('childKey_' + counter, key)
            counter++
        }
    }
    vars.put('childKey_matchNr', counter -1 as String)
    

更多信息:Groovy - 解析和生成 JSON


推荐阅读