Karate框架是否内置JSON与XML互转关键字或示例文件?
Karate框架中JSON与XML双向转换的内置支持
绝对有!Karate框架本身就内置了JSON和XML双向转换的能力,完全不需要额外引入第三方库,用起来相当顺手,不管是处理静态的payload还是动态的请求/响应,都有对应的内置函数支持。
核心转换函数
Karate提供了两个核心内置函数来处理互转:
karate.xml():将JSON对象/数组转换为XML字符串karate.json():将XML字符串/响应转换为JSON对象
1. JSON转XML示例
如果你的输入是JSON格式的payload,直接用karate.xml()就能完成转换,还可以指定根节点名称(如果JSON是顶级对象,建议指定根节点,避免生成的XML没有明确根元素):
# 定义JSON payload * def userJson = { id: 123, name: "Preethi", email: "preethi@example.com", roles: ["admin", "user"] } # 转换为XML,指定根节点为<user> * def userXml = karate.xml(userJson, 'user') # 输出查看结果(可选) * print userXml
生成的XML大概是这样:
<user> <id>123</id> <name>Preethi</name> <email>preethi@example.com</email> <roles>admin</roles> <roles>user</roles> </user>
如果是JSON数组,Karate会自动处理为重复的子节点,比如:
* def usersJson = [{name: "A"}, {name: "B"}] * def usersXml = karate.xml(usersJson, 'users')
生成的XML会包含两个<user>子节点在<users>根节点下。
2. XML转JSON示例
对于XML格式的输入(比如接口响应、静态XML字符串),用karate.json()可以直接转成JSON对象,方便后续的断言或数据处理:
# 定义XML字符串 * def userXml = """ <user id="123"> <name>Preethi</name> <email>preethi@example.com</email> </user> """ # 转换为JSON * def userJson = karate.json(userXml) # 断言XML中的属性会被转成带@前缀的键 * match userJson['@id'] == '123' * match userJson.name == 'Preethi'
如果是接口返回的XML响应,直接用response作为参数传入即可:
Scenario: 把XML响应转成JSON处理 Given url 'https://api.example.com/users/123' When method get Then status 200 * def userJson = karate.json(response) * match userJson.user.name == 'Preethi'
针对Payload Input的实战场景
如果你的测试中需要直接将JSON payload转成XML发送请求,或者反过来,完全可以在请求步骤中直接集成转换逻辑:
场景1:JSON转XML作为请求体发送
Scenario: 发送XML格式的请求(从JSON转换而来) * def requestJson = { product: { id: 456, name: "Laptop", price: 999 } } * def requestXml = karate.xml(requestJson) Given url 'https://api.example.com/products' And header Content-Type = 'application/xml' And request requestXml When method post Then status 201
场景2:接收XML响应并转成JSON断言
Scenario: 解析XML响应为JSON并验证 Given url 'https://api.example.com/products/456' When method get Then status 200 * def productJson = karate.json(response) * match productJson.product.price == 999 * match productJson.product['@id'] == '456'
额外技巧
- 对于复杂的XML结构(比如命名空间、特殊字符),Karate的内置函数也能自动处理,不需要额外配置
- 如果需要自定义转换规则(比如修改节点名称、忽略某些字段),可以结合Karate的
karate.map()或karate.filter()函数在转换前后处理数据
内容的提问来源于stack exchange,提问作者Preethi Ravi
相关产品推荐
相关产品推荐

