如何在Karate框架中匹配嵌套JSON对象的动态键?
在Karate中匹配含动态键的嵌套JSON响应
核心思路
Karate通过#string占位符处理动态键,只需定义每个动态键对应值的结构Schema,即可匹配所有符合该结构的键值对。
分步实现
- 定义机场层级的Schema
先明确airports下每个动态键对应的对象结构:
* def airportSchema = { name: "#string", city_code: "#string", city_name: "#string", country_code: "#string", country_name: "#string", lat: "#number", lng: "#number", timezone: "#string", type: "#string" }
- 定义城市层级的Schema
接着定义data下每个动态键对应的城市对象结构,其中airports字段是含动态键的对象,每个值需符合上述airportSchema:
* def citySchema = { name: "#string", city_code: "#string", country_code: "#string", country_name: "#string", city_name: "#string", type: "#string", airports: { "#string": "#(airportSchema)" } }
- 匹配整个
data结构
最后用{ "#string": "#(citySchema)" }匹配data下所有动态键对应的城市对象,确保每个键值对都符合结构:
* match flightAutocompleteDetails.response.data == { "#string": "#(citySchema)" }
替代写法(内联Schema)
如果不想拆分变量,也可以直接内联所有结构:
* match flightAutocompleteDetails.response.data == { "#string": { name: "#string", city_code: "#string", country_code: "#string", country_name: "#string", city_name: "#string", type: "#string", airports: { "#string": { name: "#string", city_code: "#string", city_name: "#string", country_code: "#string", country_name: "#string", lat: "#number", lng: "#number", timezone: "#string", type: "#string" } } } }
对原有尝试的修正
- 避免使用
contains:contains仅检查存在性,无法确保所有动态键对应的对象都符合结构;若需严格校验,使用==更合适。 - 变量引用无需加引号:原代码中
'#(^response_data_airports)'的引号是多余的,直接写#(response_data_airports)即可。
内容的提问来源于stack exchange,提问作者Veerabbhadrayya Math
相关产品推荐
相关产品推荐

