golang基于结构体标签实现JSON条件验证解析插件库omg.jsonparser的使用
Golang基于结构体标签实现JSON条件验证解析插件库omg.jsonparser的使用
简介
omg.jsonParser是一个简单的JSON解析器,带有条件验证功能。它是标准Go JSON库的包装器,通过Golang结构体字段标签可以添加验证条件。
示例
package main
import (
"fmt"
"github.com/dedalqq/omg.jsonparser"
)
func main() {
jsonData := `{"name": ""}`
st := struct {
Name string `json:"name,notEmpty"` // 添加notEmpty启用该字段的验证
}{}
err := jsonparser.Unmarshal([]byte(jsonData), &st)
if err != nil {
fmt.Println(err.Error()) // 输出: value [name] must be not empty
}
}
结构体标签
标签格式如下:
json:"[name][,option]..."
标签示例
package main
type data struct {
F1 string `json:"f1,notEmpty"` // 字段不能为空但可以是"null"或不存在
F2 string `json:"f2,notEmpty,required"` // 字段必须存在且不能为空但可以是"null"值
F3 string `json:"f3,notEmpty,notNull"` // 字段不能为空且不能是"null"但可以不存在
F4 []string `json:"f4,notNull,min:3"` // 字段不能是"null"且必须包含3个或更多项但可以不存在
}
可用标签选项
名称 | 类型 | 描述 |
---|---|---|
required |
任意 | 字段必须存在,可以是任何值或null |
notEmpty |
任意 | 字段可以不存在,但如果存在则值不能为零值,可以是null |
notEmpty |
slice | 字段必须有一个或多个元素,但可以是null 或不存在 |
notNull |
任意 | 字段不应为null,但可以不存在 |
uniq |
[]string | 字符串切片必须只包含唯一字符串 |
min:n |
slice | 切片必须有n 个或更多项 |
max:n |
slice | 切片必须有n 个或更少项 |
min:n |
string | 字符串必须有n 个或更多rune字符 |
max:n |
string | 字符串必须有n 个或更少rune字符 |
min:n |
int/uint | 值必须等于n 或更大 |
max:n |
int/uint | 值必须等于n 或更小 |
更多关于golang基于结构体标签实现JSON条件验证解析插件库omg.jsonparser的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang基于结构体标签实现JSON条件验证解析插件库omg.jsonparser的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
使用 omg.jsonparser 实现 Golang JSON 条件验证
omg.jsonparser 是一个基于结构体标签实现 JSON 条件验证的 Golang 库,它允许你通过简单的标签定义来验证 JSON 数据。
安装
go get github.com/dragon-zhang/omg.jsonparser
基本用法
1. 定义结构体与标签
type User struct {
ID int `json:"id" validate:"required,min=1"`
Username string `json:"username" validate:"required,min=3,max=20"`
Email string `json:"email" validate:"required,email"`
Age int `json:"age" validate:"min=18,max=120"`
Password string `json:"password" validate:"required,min=8,max=64"`
}
2. 解析并验证 JSON
package main
import (
"fmt"
"github.com/dragon-zhang/omg.jsonparser"
)
func main() {
jsonStr := `{
"id": 1,
"username": "john_doe",
"email": "john@example.com",
"age": 25,
"password": "secure123"
}`
var user User
err := omg.jsonparser.ParseJSON(jsonStr, &user)
if err != nil {
fmt.Println("Validation error:", err)
return
}
fmt.Printf("Valid user: %+v\n", user)
}
支持的验证标签
omg.jsonparser 支持以下验证规则:
required
- 字段必须存在且不为零值min=n
- 最小长度/数值max=n
- 最大长度/数值email
- 必须是有效的电子邮件格式url
- 必须是有效的 URLregexp=pattern
- 必须匹配正则表达式enum=val1,val2,...
- 必须是枚举值之一
高级用法
自定义验证函数
type Product struct {
Name string `json:"name" validate:"required"`
Price float64 `json:"price" validate:"required,custom=validatePrice"`
}
func validatePrice(value interface{}) error {
price, ok := value.(float64)
if !ok {
return fmt.Errorf("price must be a number")
}
if price <= 0 {
return fmt.Errorf("price must be positive")
}
return nil
}
func main() {
omg.jsonparser.RegisterCustomValidator("validatePrice", validatePrice)
jsonStr := `{"name": "Laptop", "price": 999.99}`
var product Product
err := omg.jsonparser.ParseJSON(jsonStr, &product)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Valid product: %+v\n", product)
}
嵌套结构验证
type Address struct {
Street string `json:"street" validate:"required"`
City string `json:"city" validate:"required"`
Country string `json:"country" validate:"required,len=2"`
}
type Customer struct {
Name string `json:"name" validate:"required"`
Age int `json:"age" validate:"min=18"`
Address Address `json:"address"`
}
func main() {
jsonStr := `{
"name": "Alice",
"age": 30,
"address": {
"street": "123 Main St",
"city": "New York",
"country": "US"
}
}`
var customer Customer
err := omg.jsonparser.ParseJSON(jsonStr, &customer)
if err != nil {
fmt.Println("Error:", err)
return
}
fmt.Printf("Valid customer: %+v\n", customer)
}
错误处理
omg.jsonparser 提供了详细的错误信息:
jsonStr := `{
"id": 0,
"username": "jo",
"email": "invalid-email",
"age": 17,
"password": "short"
}`
var user User
err := omg.jsonparser.ParseJSON(jsonStr, &user)
if err != nil {
if validationErr, ok := err.(*omg.jsonparser.ValidationError); ok {
for _, fieldErr := range validationErr.Errors {
fmt.Printf("Field %s: %s\n", fieldErr.Field, fieldErr.Message)
}
} else {
fmt.Println("Parse error:", err)
}
return
}
性能考虑
omg.jsonparser 在性能上做了优化:
- 使用反射缓存减少反射开销
- 预编译正则表达式
- 批量验证减少函数调用次数
对于高性能场景,建议在初始化时预注册所有自定义验证器。
总结
omg.jsonparser 提供了一种简洁而强大的方式来验证 JSON 数据,通过结构体标签定义验证规则,使得代码更加清晰易读。它特别适合 REST API 开发中请求参数的验证。