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 - 必须是有效的 URL
  • regexp=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 在性能上做了优化:

  1. 使用反射缓存减少反射开销
  2. 预编译正则表达式
  3. 批量验证减少函数调用次数

对于高性能场景,建议在初始化时预注册所有自定义验证器。

总结

omg.jsonparser 提供了一种简洁而强大的方式来验证 JSON 数据,通过结构体标签定义验证规则,使得代码更加清晰易读。它特别适合 REST API 开发中请求参数的验证。

回到顶部