From 9c3eceb0c8e2c2c75304a66a2b2cad61b08448e3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Sat, 29 Mar 2025 16:03:13 +0800 Subject: [PATCH] =?UTF-8?q?json=E6=95=B0=E6=8D=AE=E8=BD=AC=E6=8D=A2?= =?UTF-8?q?=E5=A4=8D=E7=94=A8json=5Ffilter=E5=BA=93?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- go.mod | 2 +- go.sum | 2 + validate.go | 104 ++++++++++------------------------------------------ 3 files changed, 22 insertions(+), 86 deletions(-) diff --git a/go.mod b/go.mod index 9458ea4..2010514 100644 --- a/go.mod +++ b/go.mod @@ -3,7 +3,7 @@ module git.zhangdeman.cn/gateway/validate go 1.24.1 require ( - git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250321102241-d6e86b64f7ca + git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250328040304-7e4a6f9f148c git.zhangdeman.cn/zhangdeman/dynamic-struct v0.0.0-20250323125506-1b217c0e4fee git.zhangdeman.cn/zhangdeman/json_filter v0.0.0-20250321103029-786c03293a28 git.zhangdeman.cn/zhangdeman/serialize v0.0.0-20241223084948-de2e49144fcd diff --git a/go.sum b/go.sum index 3fae3ca..ecd7b19 100644 --- a/go.sum +++ b/go.sum @@ -4,6 +4,8 @@ git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250321101544-734d9a9f7733 h1:j5tG00 git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250321101544-734d9a9f7733/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250321102241-d6e86b64f7ca h1:uxjzbY5fDozjyK6jkoQtuQouVTcVfXjbe3chARYSjRM= git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250321102241-d6e86b64f7ca/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= +git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250328040304-7e4a6f9f148c h1:cl3gQGXQpJ8ugDs0C/hQLfcvF4lGBm5BeABLvROFDoM= +git.zhangdeman.cn/zhangdeman/consts v0.0.0-20250328040304-7e4a6f9f148c/go.mod h1:IXXaZkb7vGzGnGM5RRWrASAuwrVSNxuoe0DmeXx5g6k= git.zhangdeman.cn/zhangdeman/dynamic-struct v0.0.0-20250319072714-eab2a7abde63/go.mod h1:10CdqBLr/d7vDQ7HlZoPdJWV9PF7zNM9QmhKt9Iz0/8= git.zhangdeman.cn/zhangdeman/dynamic-struct v0.0.0-20250321154326-850866d6f568 h1:LKmmtWBhhw2ne8/mZ5qsgm9d4tX0ut2u1FFrM745N7g= git.zhangdeman.cn/zhangdeman/dynamic-struct v0.0.0-20250321154326-850866d6f568/go.mod h1:S5KcY8KjsOFC/jPaUz4ndxcD8Prqwwsa7Thp9VHBD0Y= diff --git a/validate.go b/validate.go index 2a63152..b18c90a 100644 --- a/validate.go +++ b/validate.go @@ -13,12 +13,11 @@ import ( "fmt" "git.zhangdeman.cn/zhangdeman/consts" dynamicStructGenerate "git.zhangdeman.cn/zhangdeman/dynamic-struct" - "git.zhangdeman.cn/zhangdeman/json_filter/gjson_hack" + filter "git.zhangdeman.cn/zhangdeman/json_filter" "git.zhangdeman.cn/zhangdeman/serialize" "github.com/creasty/defaults" "github.com/go-playground/validator/v10" "github.com/tidwall/gjson" - "github.com/tidwall/sjson" "strings" ) @@ -35,10 +34,27 @@ func init() { // // Date : 15:12 2025/3/18 func Run(sourceData []byte, fieldList []StructField) ([]byte, error) { + filterRuleList := make([]filter.MapRule, 0) + for _, item := range fieldList { + filterRuleList = append(filterRuleList, filter.MapRule{ + SourcePath: item.SourcePath, + TargetPath: item.TargetPath, + Required: item.Required, + DataType: item.Type, + DefaultValue: item.DefaultValue, + }) + } + // source_path => target_path数据转换 + filterInstance := filter.NewFilter(string(sourceData), filterRuleList) + if err := filterInstance.Deal(); nil != err { + return nil, err + } + // 格式化sourceData handleInstance := &handle{ - sourceData: sourceData, + sourceData: filterInstance.Byte(), fieldList: fieldList, parentFieldTable: map[string]bool{}, + formatVal: filterInstance.String(), } tagTable := map[string]string{} for _, item := range fieldList { @@ -92,10 +108,6 @@ func (h *handle) Run() ([]byte, error) { Args: nil, }) } - // 格式化数据 - if _, err := h.formatDataValue(field); nil != err { - return nil, err - } // 支持嵌套结构体 fieldTag := h.generateTag(field) // 这里需要设置为对应类型的零值就行, 此处传入值的目的只是为了确认数据类型 @@ -141,84 +153,6 @@ func (h *handle) checkRequired(field StructField) (bool, bool) { return false, isHasRequiredRule } -// getSourceDataValue 获取源数据值 -func (h *handle) formatDataValue(field StructField) (any, error) { - sourceValue := gjson.GetBytes(h.sourceData, field.SourcePath) - if !sourceValue.Exists() { - if field.Required { - return nil, errors.New(field.SourcePath + " is required") - } - if len(field.DefaultValue) > 0 { - // 非必传, 且设置了默认值, 在数据源不存在时, 这只默认值 - sourceValue = gjson.Result{ - Type: gjson.String, - Raw: field.DefaultValue, - Str: field.DefaultValue, - Num: 0, - Index: 0, - Indexes: nil, - } - } else { - // 非必传, 且没有默认值, 就当做数据不存在 - return nil, nil - } - } - var ( - val any - err error - ) - defer func() { - if nil == err && nil != val { - // 更新到格式化之后的数据结构中 - h.formatVal, err = sjson.Set(h.formatVal, field.TargetPath, val) - } - }() - switch field.Type { - - case consts.DataTypeInt: // Int类型 - fallthrough - case consts.DataTypeIntPtr: // Uint类型 - val, err = gjson_hack.Int(sourceValue) - return val, err - case consts.DataTypeUint: - fallthrough - case consts.DataTypeUintPtr: // Uint类型 - val, err = gjson_hack.Uint(sourceValue) - return val, err - case consts.DataTypeFloat32: - fallthrough - case consts.DataTypeFloat32Ptr: // Float类型 - val, err = gjson_hack.Float64(sourceValue) - return val, err - case consts.DataTypeString: // String类型 - val = sourceValue.String() - return val, nil - case consts.DataTypeBool: // Bool类型 - val = sourceValue.Bool() - return val, nil - case consts.DataTypeSliceFloat: // Float slice - val, err = gjson_hack.SliceFloat(sourceValue) - return val, err - case consts.DataTypeSliceInt: // Int slice - val, err = gjson_hack.SliceInt(sourceValue) - return val, err - case consts.DataTypeSliceUint: // Uint slice - val, err = gjson_hack.SliceUint(sourceValue) - return val, err - case consts.DataTypeSliceString: // String slice - val, err = gjson_hack.SliceString(sourceValue) - return val, err - case consts.DataTypeSliceBool: // Bool slice - val, err = gjson_hack.SliceBool(sourceValue) - return val, err - case consts.DataTypeMapStrAny: // Bool slice - val, err = gjson_hack.MapStrAny[any](sourceValue) - return val, err - } - val = sourceValue.Value() - return val, nil -} - // 生成结构体的tag标签 func (h *handle) generateTag(field StructField) string { tagList := []string{