Karate 如何访问JsonPath数组结果的值(空手道断言)

Karate 如何访问JsonPath数组结果的值(空手道断言),karate,Karate,来自API的我的JSON响应: { "args": { "param1": "valueA", "param2": "valueB" } } 我的空手道主张: #✅ 并匹配response.args.param1==“valueA” # ❌ 实际:[“valueB”],预期为:“valueB” 并匹配$…param2==“valueB” # ❌ 实际值:[2],预期值:2,原因:不相等(JSONArray:Integer) 并匹配$…args.

来自API的我的JSON响应:

{
    "args": {
        "param1": "valueA",
        "param2": "valueB"
    }
}

我的空手道主张:

#✅
并匹配response.args.param1==“valueA”
# ❌ 实际:[“valueB”],预期为:“valueB”
并匹配$…param2==“valueB”
# ❌ 实际值:[2],预期值:2,原因:不相等(JSONArray:Integer)
并匹配$…args.length()==2

从中我了解到,当我使用JsonPath通配符时,总是返回一个数组。所以我的问题是如何访问该数组的第一个也是唯一一个元素,以便在断言中使用?我尝试添加
[0]
,但没有成功。

JsonPath总是返回一个数组,因为它是一个“搜索”。所以当你做
*
的时候-就是这样。您必须按索引提取:

* match response..param1 == ['valueA']
* def temp = $..param1
* match temp[0] == 'valueA'
编辑:如果您真的关心从JsonPath结果中获取第一个元素的“意图”,那么您可以这样做:

* def temp = get[0] $..param1
* match temp == 'valueA'

JsonPath总是返回一个数组,因为它是一个“搜索”。所以当你做
*
的时候-就是这样。您必须按索引提取:

* match response..param1 == ['valueA']
* def temp = $..param1
* match temp[0] == 'valueA'
编辑:如果您真的关心从JsonPath结果中获取第一个元素的“意图”,那么您可以这样做:

* def temp = get[0] $..param1
* match temp == 'valueA'

你的代码可以工作。但正如我所说,添加
[0]
like
和match$…param1[0]==“valueA”
不起作用:
路径:$…param1[0],实际:[],应为:'valueA',原因:实际值不是字符串。为什么没有tmp变量就不能工作呢?所以你是说我要么(1)匹配“期望值”上的数组,要么(2)将结果存储在tmp变量中,以便稍后进行断言。我觉得选项1是误导性的,因为无论谁读了测试,都会认为API返回了一个数组,这是错误的,这只是处理JsonPath的一种黑客行为。选项2很麻烦。@dialex空手道是开源的,所以欢迎您提交PR。看起来JsonPath很棘手,它适用于阵列,而不是您试图做的繁琐的黑客现场级工作
$[*].foo[0]
并不表示
$[*].foo
结果的第一个元素。你能给我指一下其他的框架吗?它们可以用一种不太老套的方式来做这件事,我们可以从中学习——也可以看看我的编辑,看看你的代码是如何工作的。但正如我所说,添加
[0]
like
和match$…param1[0]==“valueA”
不起作用:
路径:$…param1[0],实际:[],应为:'valueA',原因:实际值不是字符串。为什么没有tmp变量就不能工作呢?所以你是说我要么(1)匹配“期望值”上的数组,要么(2)将结果存储在tmp变量中,以便稍后进行断言。我觉得选项1是误导性的,因为无论谁读了测试,都会认为API返回了一个数组,这是错误的,这只是处理JsonPath的一种黑客行为。选项2很麻烦。@dialex空手道是开源的,所以欢迎您提交PR。看起来JsonPath很棘手,它适用于阵列,而不是您试图做的繁琐的黑客现场级工作
$[*].foo[0]
并不表示
$[*].foo
结果的第一个元素。你能给我指一下其他的框架吗?它们可以用一种不太老套的方式来做这件事,我们可以从中学习,也可以看看我的编辑