gin框架将json字符串加载到struct并根据strcut中的tag验证字段值。没有ginContext
以下是一个示例代码,使用了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结构体的内容。如果验证不通过,则打印错误信息。
原文地址: https://www.cveoy.top/t/topic/bYZT 著作权归作者所有。请勿转载和采集!