Golang中如何使用JSON Schema验证JSON数据
Golang中如何使用JSON Schema验证JSON数据 谁能帮我看看如何使用 JSON Schema 来验证 JSON 数据… 能否分享一下源代码…
4 回复
感谢 lutzhorn
更多关于Golang中如何使用JSON Schema验证JSON数据的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
未经许可不得使用。该库基于 Apache-2.0 许可证发布,因此您必须遵守其条款。若无法做到,您可以自由地向库的作者申请另一份单独的许可证。
您所说的“免费”具体指什么?如果是指“无需支付费用”,那么是的,根据 Apache 2.0 许可证,它已经是免费的。但您为此“付出”的代价是,原始维护者不提供任何形式的担保或责任承担。
一个简单的网络搜索返回了这个项目:
xeipuuv/gojsonschema
JSON Schema 草案 v4、v6 和 v7 的一个实现 - Go 语言 - xeipuuv/gojsonschema
在Golang中,可以使用第三方库如github.com/xeipuuv/gojsonschema来实现JSON Schema验证。以下是一个完整示例:
package main
import (
"fmt"
"github.com/xeipuuv/gojsonschema"
)
func main() {
// 定义JSON Schema
schemaString := `{
"type": "object",
"properties": {
"name": {"type": "string"},
"age": {"type": "number", "minimum": 0},
"email": {"type": "string", "format": "email"}
},
"required": ["name", "age"]
}`
// 待验证的JSON数据
documentString := `{
"name": "张三",
"age": 25,
"email": "zhangsan@example.com"
}`
// 创建Schema加载器
schemaLoader := gojsonschema.NewStringLoader(schemaString)
documentLoader := gojsonschema.NewStringLoader(documentString)
// 执行验证
result, err := gojsonschema.Validate(schemaLoader, documentLoader)
if err != nil {
panic(err.Error())
}
// 检查验证结果
if result.Valid() {
fmt.Println("JSON数据验证通过")
} else {
fmt.Println("JSON数据验证失败:")
for _, desc := range result.Errors() {
fmt.Printf("- %s\n", desc)
}
}
}
另一个常用库是github.com/santhosh-tekuri/jsonschema,示例如下:
package main
import (
"encoding/json"
"fmt"
"github.com/santhosh-tekuri/jsonschema"
)
func main() {
// 编译Schema
compiler := jsonschema.NewCompiler()
schema := `{
"type": "object",
"properties": {
"id": {"type": "integer"},
"status": {"type": "string", "enum": ["active", "inactive"]}
},
"required": ["id"]
}`
if err := compiler.AddResource("schema.json", []byte(schema)); err != nil {
panic(err)
}
compiledSchema, err := compiler.Compile("schema.json")
if err != nil {
panic(err)
}
// 验证JSON数据
data := map[string]interface{}{
"id": 1001,
"status": "active",
}
jsonData, _ := json.Marshal(data)
var v interface{}
json.Unmarshal(jsonData, &v)
if err := compiledSchema.Validate(v); err != nil {
fmt.Printf("验证失败: %v\n", err)
} else {
fmt.Println("验证成功")
}
}
对于更复杂的验证场景,可以使用github.com/qri-io/jsonschema:
package main
import (
"encoding/json"
"fmt"
"github.com/qri-io/jsonschema"
)
func main() {
schemaData := []byte(`{
"title": "产品信息",
"type": "object",
"properties": {
"productId": {
"type": "integer",
"minimum": 1
},
"price": {
"type": "number",
"exclusiveMinimum": 0
},
"tags": {
"type": "array",
"items": {
"type": "string"
},
"minItems": 1
}
},
"required": ["productId", "price"]
}`)
rs := &jsonschema.Schema{}
if err := json.Unmarshal(schemaData, rs); err != nil {
panic(err)
}
// 验证多个数据
testCases := []string{
`{"productId": 1, "price": 99.9, "tags": ["electronics"]}`,
`{"productId": 0, "price": -10}`,
}
for i, testCase := range testCases {
var data interface{}
json.Unmarshal([]byte(testCase), &data)
errs, _ := rs.ValidateBytes([]byte(testCase))
if len(errs) > 0 {
fmt.Printf("用例%d验证失败: %v\n", i+1, errs)
} else {
fmt.Printf("用例%d验证成功\n", i+1)
}
}
}
这些示例展示了不同JSON Schema库的基本用法,包括模式定义、数据验证和错误处理。

