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

JSON部分Schema匹配失败,如何实现无错的部分匹配?

实现Payload与部分Schema的无错误匹配

问题场景

尝试用部分Schema校验Payload时失败,原因是Payload包含Schema中未定义的额外字段,报错提示实际数据比预期多了多余的键。

相关代码示例

Payload定义

Given def payload =
"""
{
  "salesService": [
    {
      "name": "Test User",
      "username": "testuser",
      "email": "test@user.com",
      "address": {
        "doorNo": 32,
        "street": "Kenlab Clise",
        "landmark": true,
        "city": "Bracknell",
        "county": "Berkshire",
        "zipcode": "LI867H"
      }
    }
  ]
}
"""

Schema定义

* def schema =
"""
{
  "salesService": [
    {
      "name": "#string",
      "username": "#string",
      "email": "#present"
    }
  ]
}
"""

匹配语句

Then match payload contains schema

错误信息

$.salesService[0] | not equal | actual has 1 more key(s) than expected - {"address":{"doorNo":2,"street":"Kenton Close","landmark":true,"city":"Bracknell","county":"Berkshire","zipcode":"RG129AZ"}} (MAP:MAP)       {"name":"Test User","username":"testuser","email":"test@user.com","address":{"doorNo":2,"street":"Kenton Close","landmark":true,"city":"Bracknell","county":"Berkshire","zipcode":"RG129AZ"}}       {"name":"#string","username":"#string","email":"#present"} 

解决方案

在Karate中,有两种常用方法实现忽略额外字段的部分匹配:

方法1:使用#ignore关键字

在Schema的对象中添加"#ignore": "#ignore",表示忽略所有未在Schema中定义的额外字段:

* def schema =
"""
{
  "salesService": [
    {
      "name": "#string",
      "username": "#string",
      "email": "#present",
      "#ignore": "#ignore"
    }
  ]
}
"""

方法2:使用#partial关键字

在需要忽略额外字段的对象前加上#partial标记,明确指定该对象仅校验Schema中定义的字段:

* def schema =
"""
{
  "salesService": [
    #partial {
      "name": "#string",
      "username": "#string",
      "email": "#present"
    }
  ]
}
"""

修改Schema后,再执行Then match payload contains schema语句,即可成功完成部分匹配,不再因额外字段报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 08:07:48