以下是一个示例代码,使用了go内置的json和reflect包,以及errors包来处理错误信息。这个代码中,我们定义了一个结构体User,用于存储Json字符串中的数据。我们使用了tag来标记每个字段的验证规则,并且使用了reflect包来遍历结构体中的字段和tag。如果Json字符串中的数据不符合验证规则,则返回错误信息。

package main

import (
    "encoding/json"
    "errors"
    "fmt"
    "reflect"
)

type User struct {
    Username string `json:"username,omitempty" validate:"required"`
    Password string `json:"password,omitempty" validate:"required"`
    Email    string `json:"email,omitempty" validate:"required,email"`
}

func main() {
    jsonStr := `{
        "username": "testuser",
        "password": "testpassword",
        "email": "testuser@example.com"
    }`

    var user User
    if err := json.Unmarshal([]byte(jsonStr), &user); err != nil {
        fmt.Println("Error:", err)
        return
    }

    if err := validateStruct(user); err != nil {
        fmt.Println("Error:", err)
        return
    }

    fmt.Printf("User: %+v\n", user)
}

func validateStruct(s interface{}) error {
    v := reflect.ValueOf(s)
    t := v.Type()

    for i := 0; i < t.NumField(); i++ {
        field := t.Field(i)
        value := v.Field(i).Interface()

        if tag := field.Tag.Get("validate"); tag != "" {
            rules := parseTag(tag)

            for _, rule := range rules {
                if err := validateValue(value, rule); err != nil {
                    return err
                }
            }
        }
    }

    return nil
}

func parseTag(tag string) []string {
    return []string{"required", "email"} // TODO: Implement parser
}

func validateValue(value interface{}, rule string) error {
    switch rule {
    case "required":
        if value == "" {
            return errors.New("Field is required")
        }
    case "email":
        if value != "" {
            // TODO: Implement email validator
        }
    }

    return nil
}

在这个示例代码中,我们定义了一个validateStruct函数,用于遍历结构体的字段和tag,并且调用validateValue函数来验证每个字段的值。我们还定义了一个parseTag函数,用于解析tag中的规则。在validateValue函数中,我们使用了switch语句来根据传入的规则来验证值。如果验证不通过,则返回错误信息。在主函数中,我们首先将Json字符串加载到User结构体中,并且调用validateStruct函数来验证结构体中的字段值。如果验证通过,则打印User结构体的内容。如果验证不通过,则打印错误信息。

gin框架将json字符串加载到struct并根据strcut中的tag验证字段值。没有ginContext

原文地址: https://www.cveoy.top/t/topic/bYZT 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录