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

如何在JMeter 5.4.3中实现JSON Schema v0.7/2020-12验证REST响应

在JMeter 5.4.3中实现JSON Schema v0.7/2020-12版本验证

替代方案:使用JSR223 Assertion + JSON Schema Java库

由于Schema Assertion插件仅支持v0.4且存在线程变量混淆问题,推荐通过JSR223 Assertion结合专业JSON Schema验证库来实现需求,步骤如下:

1. 准备依赖Jar包

下载以下Jar包并放入JMeter安装目录的lib文件夹,随后重启JMeter:

  • everit-json-schema-1.14.0.jar(支持v0.7和2020-12版本)
  • json-schema-validator-1.14.0.jar
  • jackson-databind-2.15.2.jar
  • jackson-core-2.15.2.jar
  • jackson-annotations-2.15.2.jar

2. 编写JSR223 Assertion验证脚本

在需要验证的HTTP请求下添加JSR223 Assertion,选择Groovy作为语言,粘贴以下脚本(根据你的Schema版本调整):

import org.everit.json.schema.Schema
import org.everit.json.schema.loader.SchemaLoader
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper

// 获取接口响应JSON内容
def responseJson = prev.getResponseDataAsString()
if (responseJson.isEmpty()) {
    AssertionResult.setFailure(true)
    AssertionResult.setFailureMessage("响应为空,无法执行JSON Schema验证")
    return
}

// 替换为你的目标JSON Schema(支持v0.7或2020-12)
def schemaJson = '''
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": {
    "id": {"type": "integer"},
    "name": {"type": "string"}
  },
  "required": ["id", "name"]
}
'''

// 初始化JSON解析工具
ObjectMapper mapper = new ObjectMapper()
JsonNode responseNode = mapper.readTree(responseJson)
JsonNode schemaNode = mapper.readTree(schemaJson)

// 加载Schema并指定版本:2020-12用draftV202012Support(),v0.7用draftV7Support()
SchemaLoader loader = SchemaLoader.builder()
    .schemaJson(schemaNode)
    .draftV202012Support()
    .build()

Schema schema = loader.load().build()

// 执行验证并处理结果
try {
    schema.validate(responseNode)
} catch (Exception e) {
    AssertionResult.setFailure(true)
    AssertionResult.setFailureMessage("JSON Schema验证失败: " + e.getMessage())
}

3. 优化线程安全问题

如果你的Schema是固定不变的,为避免重复加载和线程变量混淆,可将Schema加载逻辑移至Setup Thread Group,把Schema对象存入全局属性:

Setup Thread Group中的脚本:

import org.everit.json.schema.Schema
import org.everit.json.schema.loader.SchemaLoader
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper

def schemaJson = '''你的Schema内容'''
ObjectMapper mapper = new ObjectMapper()
JsonNode schemaNode = mapper.readTree(schemaJson)

SchemaLoader loader = SchemaLoader.builder()
    .schemaJson(schemaNode)
    .draftV202012Support()
    .build()

Schema schema = loader.load().build()
props.put("globalSchema", schema) // 存入全局属性

然后在业务线程组的JSR223 Assertion中直接调用:

import org.everit.json.schema.Schema
import com.fasterxml.jackson.databind.JsonNode
import com.fasterxml.jackson.databind.ObjectMapper

def responseJson = prev.getResponseDataAsString()
if (responseJson.isEmpty()) {
    AssertionResult.setFailure(true)
    AssertionResult.setFailureMessage("响应为空,无法执行JSON Schema验证")
    return
}

Schema schema = props.get("globalSchema")
ObjectMapper mapper = new ObjectMapper()
JsonNode responseNode = mapper.readTree(responseJson)

try {
    schema.validate(responseNode)
} catch (Exception e) {
    AssertionResult.setFailure(true)
    AssertionResult.setFailureMessage("JSON Schema验证失败: " + e.getMessage())
}

版本切换说明

  • 若使用v0.7版本,需修改两处:
    1. Schema中的$schema字段改为"http://json-schema.org/draft-07/schema#"
    2. SchemaLoader配置替换为.draftV7Support()

内容的提问来源于stack exchange,提问作者Narek K.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 09:40:29