Karate提取空值时如何避免转为空数组而获取空字符串
Karate框架提取空值时返回空字符串的解决方案
问题描述
在Karate框架的Background中执行后台调用捕获变量时,预期变量应为字符串或空值,但空变量会被返回为带换行的空数组(如"firstDMAPIRouterId": []),而非预期的空字符串""。尝试用string声明变量仅得到无换行的空数组字符串"[]",仍不符合需求,需解决如何提取值且空值不转为数组的问题。
示例代码
Feature: Background: * def jsonExample = """ { menu: { id: 'file', value: 'File', popup: { menuitem: [ {value: 'New', onclick: 'CreateNewDoc()'}, {value: 'Open', onclick: 'OpenDoc()'}, {value: 'Close', onclick: 'CloseDoc()'} ] } } } """ Scenario: * print jsonExample * def newItem = get[0] jsonExample.menu.popup.menuitem[?(@.value == 'New')].onclick * print 'onclick value of new is: ', newItem * def saveItem = get[0] jsonExample.menu.popup.menuitem[?(@.value == 'Save')].onclick * print 'onclick value of save is: ', saveItem * string saveItem2 = get[0] jsonExample.menu.popup.menuitem[?(@.value == 'Save')].onclick * print 'onclick value of save2 is: ', saveItem2 * def saveItem3 = karate.jsonPath(jsonExample, "$.menu.popup.menuitem[?(@.value == 'Save')].onclick") * print 'onclick value of save3 is: ', saveItem3
运行结果
13:40:43.394 [com.intuit.karate.cli.Main.main()] INFO com.intuit.karate - [print] onclick value of new is: CreateNewDoc() 13:40:43.397 [com.intuit.karate.cli.Main.main()] INFO com.intuit.karate - [print] onclick value of save is: [ ] 13:40:43.400 [com.intuit.karate.cli.Main.main()] INFO com.intuit.karate - [print] onclick value of save2 is: [] 13:40:43.432 [com.intuit.karate.cli.Main.main()] INFO com.intuit.karate - [print] onclick value of save3 is: [ ]
解决方案
可以通过以下几种方式实现空值返回为空字符串而非数组:
1. 利用karate.get()结合逻辑或表达式
karate.get()在指定路径不存在时会返回null,结合|| ''可直接将null转为空字符串:
* def saveItem = karate.get('jsonExample.menu.popup.menuitem[?(@.value == \'Save\')].onclick[0]') || '' * print 'onclick value of save is: ', saveItem
2. 自定义复用函数处理结果
编写一个通用函数,提取结果后判断数组长度,为空则返回空字符串:
* def getValueOrEmpty = function(obj, path) { var result = karate.jsonPath(obj, path); return result.length > 0 ? result[0] : ''; } * def saveItem = getValueOrEmpty(jsonExample, '$.menu.popup.menuitem[?(@.value == \'Save\')].onclick') * print 'onclick value of save is: ', saveItem
该函数可重复用于多个提取场景,提升代码复用性。
3. 先提取数组再做三元判断
先获取完整的提取结果(空数组或含值数组),再根据数组长度决定返回值:
* def temp = get jsonExample.menu.popup.menuitem[?(@.value == 'Save')].onclick * def saveItem = temp.length == 0 ? '' : temp[0] * print 'onclick value of save is: ', saveItem
内容的提问来源于stack exchange,提问作者mike
相关产品推荐
相关产品推荐

