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

Karate复杂JSON Schema验证未按预期工作,求解决方案

Karate 1.4.1.RC3 中 JSON Schema 验证问题排查与解决

问题背景

项目尝试使用Karate进行JSON Schema验证,参考相关方案后,在1.4.1.RC3版本测试时遇到异常:包含空数组的元素无法通过验证,尽管对应Bug声称在v0.8.0版本已修复。

测试Feature代码

Feature: JSON Schema validation

Background:
    * def json =
    """
    {
      "foo": {
        "bars": [
          { "barOne": "dc", "barTwos": [] },
          { "barOne": "dc", "barTwos": [{ title: 'blah' }] },
          { "barOne": "dc", "barTwos": [{ title: 'blah' }] },
          { "barOne": "dc", "barTwos": [{ title: 'blah' }] }
        ]
      }
    }
    """
    
    * def barTwo = { title: '#string' }
    * def bar = 
        """
            { barOne: '#string', barTwos: '##[] barTwo' }
        """
    
    Scenario: Validate JSON Schema
    * match json.foo.bars == '#[] bar'

错误输出

match failed: EQUALS
$ | match each failed at index 0 (LIST:MAP)
[{"barOne":"dc","barTwos":[]},{"barOne":"dc","barTwos":[{"title":"blah"}]},{"barOne":"dc","barTwos":[{"title":"blah"}]},{"barOne":"dc","barTwos":[{"title":"blah"}]}]
{"barOne":"#string","barTwos":"##[] barTwo"}

$[0] | not equal | match failed for name: 'barTwos' (MAP:MAP)
{"barOne":"dc","barTwos":[]}
{"barOne":"#string","barTwos":"##[] barTwo"}

  $[0].barTwos | match each failed, empty array / list (LIST:MAP)
  []
  {"title":"#string"}

解决方案

问题核心是*##[]* barTwo的匹配规则:它要求数组必须包含至少一个符合barTwo结构的元素,但第一个元素的barTwos是空数组,触发验证失败。要兼容空数组和非空数组场景,需改用*#[]* barTwo(单井号),该规则允许数组为空,或每个元素符合barTwo结构。

修改后的bar定义:

* def bar = 
    """
        { barOne: '#string', barTwos: '#[] barTwo' }
    """

也可以用#?表达式显式处理空数组场景:

* def bar = 
    """
        { 
            barOne: '#string', 
            barTwos: '#? _ == [] || _ == #[] barTwo' 
        }
    """

两种写法均可让空数组、非空数组场景通过验证,同时保证非空数组元素符合barTwo结构要求。

内容的提问来源于stack exchange,提问作者Jigar

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 14:18:30