如何解决迭代复杂的 JsonArray 并根据 JsonPath 中的索引传递值
我正在尝试遍历数组,需要将数组的每个项目与我从另一个 Json 响应创建的模板进行比较。这是我得到的示例响应。它要大得多,而且数组的大小是动态的。
* def actual =
"""
{ "id": "10103","city": "xxx","eq": "xxx","noOfSqt": "20000"
},{ "id": "12394",{ "id": "74747","noOfSqt": "20000"
}
"""
从另一个 json 响应中,我将 ID 保存在列表中。它们与“实际”数组中的 id 的顺序不同。看起来是这样。
* def IDs = [12394,74747,10103]
如果我只有大小为 1 的“实际”数组,则这是我的解决方案,我正在传递索引 0。我从 ID 列表中获取第一项,然后根据该 ID 从“实际”数组中检索数组项。
* def i = 0 //index zero
* def index = IDs[i] //first item of the array at index 0 is 12394
* def firstObject = karate.jsonPath(actual,"$[?(@.id == '" + index + "')]")[0] //array object where id is 12394
* def city = karate.jsonPath(someOtherjson,"$.loc[?(@.newID == '" + index + "')].value")[0]
* def eq = karate.jsonPath(someOtherjson,"$.mix[?(@.newID == '" + index + "')]..value")[0]
* def noOfSqt = karate.jsonPath(someOtherjson,"$.flat[?(@.newID == '" + index + "')].value")[0]
* def expected =
"""
{
"city": "#(city)","eq": "#(eq)","noOfSqt": "#(noOfSqt)"
}
"""
* match firstObject contains expected
与其传递 i = o (索引为零),不如帮我迭代,这样我就可以比较数组的每一项。我已经回顾了 karate.repeat、karate.apendTo、karate.forEach()、JS 循环,但在实现这些方面仍然存在问题。我也使用 contains 代替 == 因为数组和模板具有不同数量的属性。
解决方法
首先,您可以在一行中实现您想要的(在空手道 1.0 中用于 JS 数组映射而不是 karate.map()
):
* match actual[*].id contains IDs.map(x => x + '')
我把它作为一个练习,你要弄清楚它是如何工作。
有时使用 JsonPath 表达式或 karate.map()
将您现有的 JSON 转换为另一个“形状”是完全可以的。对于更多的细节,请阅读本:https://stackoverflow.com/a/53120851/143475
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。