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 许可证,它已经是免费的。但您为此“付出”的代价是,原始维护者不提供任何形式的担保或责任承担。

一个简单的网络搜索返回了这个项目:

GitHub GitHub

Avatar

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库的基本用法,包括模式定义、数据验证和错误处理。

回到顶部