如何匹配空手道中嵌套 json 对象中的动态键?

2024-04-22

尝试匹配空手道框架中 API 响应中的嵌套 json 对象。 以下是我的 API 响应。

    "status": {
        "code": 0,
        "message": "Successful"
    },
    "data": {
        "PHX": {
            "name": "Phoenix (All)",
            "city_code": "PHX",
            "country_code": "US",
            "country_name": "United States",
            "city_name": "Phoenix",
            "type": "city",
            "airports": {
                "SCF": {
                    "name": "Scottsdale Municipalcipal",
                    "city_code": "PHX",
                    "city_name": "Phoenix",
                    "country_code": "US",
                    "country_name": "United States",
                    "lat": 33.61667,
                    "lng": -111.916664,
                    "timezone": "America/Phoenix",
                    "type": "airport"
                },
                "PHX": {
                    "name": "Sky Harbor International",
                    "city_code": "PHX",
                    "city_name": "Phoenix",
                    "country_code": "US",
                    "country_name": "United States",
                    "lat": 33.435036,
                    "lng": -112.00016,
                    "timezone": "America/Phoenix",
                    "type": "airport"
                },
                "AZA": {
                    "name": "Williams Gateway",
                    "city_code": "PHX",
                    "city_name": "Phoenix",
                    "country_code": "US",
                    "country_name": "United States",
                    "lat": 33.307777,
                    "lng": -111.655556,
                    "timezone": "America/Phoenix",
                    "type": "airport"
                },
                "DVT": {
                    "name": "Phoenix Deer Valley Airport",
                    "city_code": "PHX",
                    "city_name": "Phoenix",
                    "country_code": "US",
                    "country_name": "United States",
                    "lat": 33.683887,
                    "lng": -112.083336,
                    "timezone": "America/Phoenix",
                    "type": "airport"
                },
                "LUF": {
                    "name": "Luke AFB",
                    "city_code": "PHX",
                    "city_name": "Phoenix",
                    "country_code": "US",
                    "country_name": "United States",
                    "lat": 33.61667,
                    "lng": -111.916664,
                    "timezone": "America/Phoenix",
                    "type": "airport"
                }
            }
        }
    }
}

我正在尝试匹配 json 对象data,这里非常棘手的部分是关键“PHX”将是动态的,我可能会得到尽可能多的 json 嵌套对象。还有airports像“SCF”、“PHX”、“AZA”这样的嵌套 json 也是动态的。如何在空手道中写比赛语句? 尝试了动态密钥的几个答案,但我的 API 响应在这里完全不同。

我尝试了以下功能文件的更改:

 * def response_data_airports =  { "#string": { "name": "#string", "city_code": "#string", "city_name": "#string", "country_code": "#string", "country_name": "#string", "lat": "#number", "lng": "#number", "timezone": "#string", "type": "#string" }}
 * def main_schema = { '#string': { "name": "#string", "city_code":
   "#string", "country_code": "#string", "country_name": "#string",
   "city_name": "#string", "type": "#string", "airports":
   '#(^response_data_airports)' }  }
 * match flightAutocompleteDetails.response.data contains main_schema

谢谢


是的,这个 JSON 并不容易处理。所以你必须做一个转变。我只关注response.data.PHX.airports一部分,剩下的就是你的家庭作业;)

* def data = []
* karate.forEach(response.data.PHX.airports, (k, v) => { v.code = k; data.push(v) })

编辑:既然你对我的第一个答案不满意,这里是你如何避免硬编码 PHX,我可以给你提示,你必须做适合你情况的事情。阅读其他示例,有很多方法可以“解压”密钥:

* def data = []
* def code = karate.keysOf(response.data)[0]
* karate.forEach(response.data[code].airports, (k, v) => { v.code = k; data.push(v) })

如果您需要更多帮助来理解这一点,请参阅:https://github.com/karatelabs/karate#json-transforms https://github.com/karatelabs/karate#json-transforms

这样做的作用是为您提供一个整洁的数组,并获取键并将其作为一个数组添加到每个数组项中code财产。现在您可以轻松地进行所有您想要的空手道比赛。

* match data[*].code == ['SCF', 'PHX', 'AZA', 'DVT', 'LUF']

既然您似乎对进行“模式”匹配感到压力,那么当然:

* match each data contains { name: '#string', city_code: '#string' }

我对测试的建议是始终测试整个有效负载,即使感觉像是在“硬编码”数据。在我看来,这对于测试您的系统是否正常工作(而不仅仅是模式匹配)更有用。

另请参阅:https://stackoverflow.com/a/57929311/143475 https://stackoverflow.com/a/57929311/143475

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何匹配空手道中嵌套 json 对象中的动态键? 的相关文章

随机推荐