如何将带嵌套结构的Gatling jsonFeeder转换为JSON请求体?
解决方案
根因说明
Gatling 的 jsonFile feeder 读取JSON文件时,会自动将JSON嵌套对象、数组解析为Scala原生集合类型:JSON对象转HashMap,JSON数组转ArraySeq。直接用Gatling EL表达式${a}引用时,默认调用集合的toString方法,输出的就是你看到的ArraySeq(HashMap(...这类结构,而非标准JSON。
修复方案
方案1:会话内直接序列化(最简修改)
引入Gatling自带的JSON序列化工具,在StringBody中通过会话函数拿到对应集合后,直接序列化为JSON字符串:
// 顶部引入Gatling自带序列化工具 import io.gatling.json.JsonSerializer val jsonFileFeeder = jsonFile("requests.json").circular val scn = scenario("cost estimation") .feed(jsonFileFeeder) .exec( http("request_1") .post("/") .body(StringBody(session => s"""{ "a": ${JsonSerializer.toJsonString(session("a").as[Map[String, Any]])} }""" )).asJson )
注意:此处
${a}原来包裹的双引号要删除,序列化输出的JSON已经自带正确格式的引号,额外加双引号会导致JSON结构错误。
方案2:预转换为JSON字符串存入会话(适合多处复用)
如果同一个JSON对象需要在多个请求中使用,可以提前将其序列化为字符串存入会话,后续直接用EL表达式引用即可:
import io.gatling.json.JsonSerializer val jsonFileFeeder = jsonFile("requests.json").circular val scn = scenario("cost estimation") .feed(jsonFileFeeder) // 预转换:将a对应的Map序列化为JSON字符串存入会话 .exec(session => session.set("aJsonStr", JsonSerializer.toJsonString(session("a").as[Map[String, Any]])) ) .exec( http("request_1") .post("/") .body(StringBody( """{ "a": ${aJsonStr} }""" )).asJson )
如果你的项目已经引入了Jackson、Circe等JSON序列化工具,也可以替换掉上面的JsonSerializer.toJsonString,使用自己项目的序列化方法实现相同效果。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

