You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将带嵌套结构的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:06:05