在 JMeter 的脚本/JSR223 里,你遇到的这种字符串本质上是**“看起来像数组/对象的文本”**,要先把它变成真正的结构(List + Dict)。不过你这个例子:
[{“1”:123},]{“1”:123}
有两个明显问题会导致不能直接用 JSON 解析:
- 使用了全角符号:
{ } ,和中文冒号:、中文引号“ ” - 结构不像标准 JSON(标准 JSON 应该是
[{ "1":123 }, { "1":123 }]这种)
下面给你两种可落地做法:
方案 A:先“归一化”为标准 JSON,再用 JSON.parse
适合:字符串格式基本稳定,只是全角/中文符号导致无法直接解析。
1)示例:把它转成标准 JSON
目标:把
-
{→{ -
}→} -
,→, -
“→" -
”→" -
:→:
再把结构问题修成合法 JSON(你这个例子似乎少了一个数组元素的 ] 位置/逗号位置)。
如果你的真实数据总是类似“一个数组 + 另一个对象混在后面”,通常要按业务规则拼成数组。
JSR223(Groovy)示例
假设原始字符串在变量
raw。
import groovy.json.JsonSlurper
def raw = vars.get("raw")
// 全角/中文符号归一化
def s = raw
.replaceAll("{", "{")
.replaceAll("}", "}")
.replaceAll(",", ",")
.replaceAll("“", "\"")
.replaceAll("”", "\"")
.replaceAll(":", ":")
// 这里需要根据你实际的“非标准拼接情况”修正结构。
// 你给的样例像: [ { "1":123 }, ] { "1":123 }
// 典型修法:把多余的 "] { ... }" 改成 " , { ... }"
s = s.replaceAll("\\]\\s*\\{", ",{")
// 以及修掉数组里的末尾多余逗号:"{...},]" => "{...}]"
s = s.replaceAll(",\\s*\\]", "]")
def parsed = new JsonSlurper().parseText(s)
// parsed 就是 List 或 Map,取决于最终 s 是否是标准 JSON 数组/对象
// 如果你想强制变成“列表嵌套字典”
def resultList = (parsed instanceof List) ? parsed : [parsed]
vars.put("result", groovy.json.JsonOutput.toJson(resultList))
log.info("resultList = ${resultList}")
方案 B:不依赖 JSON,直接用正则提取键值对再组装
适合:字符串结构千奇百怪、很难保证能拼成合法 JSON。
例如你这种总是形如 { "1": 123 } 反复出现,那么可以提取所有 {...} 里的键值对。
JSR223(Groovy)示例(提取所有对象里的 "key": value")
def raw = vars.get("raw")
def s = raw
.replaceAll("{", "{")
.replaceAll("}", "}")
.replaceAll(",", ",")
.replaceAll("“", "\"")
.replaceAll("”", "\"")
.replaceAll(":", ":")
// 提取所有 { ... } 片段
def matcher = (s =~ /\\{([^}]*)\\}/)
def list = []
matcher.each { m ->
def objText = "{" + m[1] + "}"
def obj = new groovy.json.JsonSlurper().parseText(objText) // 单个对象一般较稳定
list << obj
}
vars.put("result", groovy.json.JsonOutput.toJson(list))
log.info("list = ${list}")
你需要我确认的一点(不然“方案A里怎么修结构”会不准)
请你补充任意一个真实样例(尽量包含完整内容、不要省略),并告诉我:
- 你希望最终结果一定是
List<Map>吗?还是有时是Map? - 这类字符串是否总是“
[ {..},] {..}这种拼接错误”模式?还是可能是别的组合?
你把实际 raw 字符串贴一条出来,我可以把上面“结构修正那行 replaceAll”给你改成完全匹配你数据的版本。