You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 21:23:13