Karate框架解析带命名空间的JSON响应报语法错误如何解决
Karate解析带命名空间前缀JSON字段的方案
报错原因
JavaScript引擎的点语法访问属性时,要求属性名必须是符合规则的合法标识符,字段名包含:特殊字符时,引擎会把冒号识别成语法分隔符,而非属性名的一部分,因此抛出语法错误。
可用解决方法
方法1:方括号键名访问(最通用,无额外依赖)
所有带特殊字符(冒号、@、横杠、空格等)的JSON属性,都可以通过对象['属性名']的方括号语法访问,完全兼容特殊字符:
# 提取第一个dd:RoomStay节点 * def roomStay = response['dd:PrepareMasterBookingRS']['dd:AvailabilityResponse']['dd:RoomStays']['dd:RoomStay'][0] # 访问带@前缀的属性同理 * def transactionId = response['dd:PrepareMasterBookingRS']['@TransactionID'] * match transactionId == '123456798'
方法2:使用Karate内置JsonPath提取
Karate原生支持JsonPath语法,对于带特殊字符的键,用单引号包裹即可:
# 按层级提取目标节点 * def roomStay = karate.jsonPath(response, "$.['dd:PrepareMasterBookingRS'].['dd:AvailabilityResponse'].['dd:RoomStays'].['dd:RoomStay'][0]") # 跳过层级直接递归定位目标节点,适合嵌套层级深的场景 * def firstRoomStay = karate.jsonPath(response, "$..['dd:RoomStay'][0]")
方法3:预处理移除命名空间前缀(适合后续需要频繁访问字段的场景)
如果整个响应都带统一的dd:前缀,可以先批量处理所有键名移除前缀,后续就可以直接用简洁的点语法访问:
# 定义键名转换函数,移除dd:前缀 * def removeNs = function(key) { return key.replace('dd:', '') } * def cleanedResponse = karate.mapWithKey(response, removeNs) # 处理后直接用点语法访问即可 * def roomStay = cleanedResponse.PrepareMasterBookingRS.AvailabilityResponse.RoomStays.RoomStay[0]
注:示例中
* def response = response是冗余语句,Karate在接口请求执行完成后,会自动将响应体赋值给内置的response变量,不需要重复定义。
内容的提问来源于stack exchange,提问作者Stéphane GRILLON
相关产品推荐
相关产品推荐

