diff --git a/filter.go b/filter.go index b5b1767..07233ec 100644 --- a/filter.go +++ b/filter.go @@ -13,13 +13,8 @@ import ( "reflect" "strings" - "git.zhangdeman.cn/zhangdeman/util" - - "git.zhangdeman.cn/zhangdeman/consts" "git.zhangdeman.cn/zhangdeman/json_filter/gjson_hack" "git.zhangdeman.cn/zhangdeman/serialize" - "git.zhangdeman.cn/zhangdeman/wrapper" - "github.com/tidwall/gjson" "github.com/tidwall/sjson" @@ -133,7 +128,7 @@ func (f *filter) setResult(rule MapRule) error { ) sourceResult := gjson.Get(f.sourceData, rule.SourcePath) - if formatVal, err = f.getValue(rule.DataType, sourceResult, rule.DefaultValue); nil != err { + if formatVal, err = gjson_hack.Value(rule.DataType, sourceResult, rule.DefaultValue); nil != err { return fmt.Errorf("%s = %v can not convert to %s : %s", rule.SourcePath, sourceResult.Value(), rule.DataType, err.Error()) } if reflect.TypeOf(formatVal).Kind() == reflect.Map { @@ -210,165 +205,3 @@ func (f *filter) Parse(receiver interface{}) error { } return json.Unmarshal(f.Byte(), receiver) } - -// getValue 获取值 -// -// Author : go_developer@163.com<白茶清欢> -// -// Date : 12:25 2022/7/4 -func (f *filter) getValue(dataType consts.DataType, sourceValue gjson.Result, defaultValue string) (any, error) { - sourceValueStr := defaultValue - if sourceValue.Exists() { - str := sourceValue.String() - if len(str) > 0 { - sourceValueStr = str - } - } - - strVal := wrapper.String(sourceValueStr) - - switch dataType { - case consts.DataTypeInt: - intVal := strVal.ToInt() - return intVal.Value, intVal.Err - case consts.DataTypeUint: - uintVal := strVal.ToUint64() - return uintVal.Value, uintVal.Err - case consts.DataTypeBool: - boolVal := strVal.ToBool() - return boolVal.Value, boolVal.Err - case consts.DataTypeFloat: - floatVal := strVal.ToFloat64() - return floatVal.Value, floatVal.Err - case consts.DataTypeString: - return strVal.Value(), nil - case consts.DataTypeAny: - if sourceValue.Exists() { - // 可能存在精度丢失, 原因 : gjson.Value 内置的转换, int64 超过一定大小会存在丢失精度问题 - if sourceValue.Num > 0 { - // 说明是数字 - var res float64 - if err := util.ConvertAssign(&res, sourceValue.String()); nil != err { - return nil, err - } - return res, nil - } - return sourceValue.Value(), nil - } - return defaultValue, nil - case consts.DataTypeSliceAny: - // 任意类型的list - sliceVal := strVal.ToAnySlice() - return sliceVal.Value, sliceVal.Err - case consts.DataTypeSliceInt, consts.DataTypeSliceIntWithChar: - // 任意类型的list - if strings.HasPrefix(strVal.Value(), "[") && strings.HasSuffix(strVal.Value(), "]") { - // 序列化之后的数组 - sliceVal := strVal.ToInt64Slice() - return sliceVal.Value, sliceVal.Err - } - // 分隔的数组 - sliceVal := strVal.ToInt64Slice(",") - return sliceVal.Value, sliceVal.Err - case consts.DataTypeSliceUint, consts.DataTypeSliceUintWithChar: - // 任意类型的list - if strings.HasPrefix(strVal.Value(), "[") && strings.HasPrefix(strVal.Value(), "]") { - // 序列化之后的数组 - sliceVal := strVal.ToUint64Slice() - return sliceVal.Value, sliceVal.Err - } - // 分隔的数组 - sliceVal := strVal.ToUint64Slice(",") - return sliceVal.Value, sliceVal.Err - case consts.DataTypeSliceFloat, consts.DataTypeSliceFloatWithChar: - // 任意类型的list - if strings.HasPrefix(strVal.Value(), "[") && strings.HasPrefix(strVal.Value(), "]") { - // 序列化之后的数组 - sliceVal := strVal.ToFloat64Slice() - return sliceVal.Value, sliceVal.Err - } - // 分隔的数组 - sliceVal := strVal.ToFloat64Slice(",") - return sliceVal.Value, sliceVal.Err - case consts.DataTypeSliceBool, consts.DataTypeSliceBoolWithChar: - // 任意类型的list - if strings.HasPrefix(strVal.Value(), "[") && strings.HasPrefix(strVal.Value(), "]") { - // 序列化之后的数组 - sliceVal := strVal.ToBoolSlice() - return sliceVal.Value, sliceVal.Err - } - // 分隔的数组 - sliceVal := strVal.ToBoolSlice(",") - return sliceVal.Value, sliceVal.Err - case consts.DataTypeSliceString, consts.DataTypeSliceStringWithChar: - // 任意类型的list - if strings.HasPrefix(strVal.Value(), "[") && strings.HasPrefix(strVal.Value(), "]") { - // 序列化之后的数组 - sliceVal := strVal.ToStringSlice() - return sliceVal.Value, sliceVal.Err - } - // 分隔的数组 - sliceVal := strVal.ToStringSlice(",") - return sliceVal.Value, sliceVal.Err - case consts.DataTypeSliceSlice, consts.DataTypeMapAnyAny: - return nil, errors.New(consts.DataTypeSliceSlice.String() + " : data type is not support") - case consts.DataTypeSliceMapStringAny: - if !sourceValue.IsArray() { - return nil, errors.New("data type is not array") - } - var res []map[string]any - err := strVal.ToStruct(&res) - return res, err - case consts.DataTypeMapStrInt: - if !sourceValue.IsObject() { - return nil, ErrDataIsNotObject - } - var res map[string]int64 - err := strVal.ToStruct(&res) - return res, err - case consts.DataTypeMapStrUint: - if !sourceValue.IsObject() { - return nil, ErrDataIsNotObject - } - var res map[string]uint64 - err := strVal.ToStruct(&res) - return res, err - case consts.DataTypeMapStrFloat: - if !sourceValue.IsObject() { - return nil, ErrDataIsNotObject - } - var res map[string]float64 - err := strVal.ToStruct(&res) - return res, err - case consts.DataTypeMapStrBool: - if !sourceValue.IsObject() { - return nil, ErrDataIsNotObject - } - var res map[string]bool - err := strVal.ToStruct(&res) - return res, err - case consts.DataTypeMapStrAny: - if !sourceValue.IsObject() { - return nil, ErrDataIsNotObject - } - var res map[string]any - err := strVal.ToStruct(&res) - return res, err - case consts.DataTypeMapStrStr: - if !sourceValue.IsObject() { - return nil, ErrDataIsNotObject - } - var res map[string]string - err := strVal.ToStruct(&res) - return res, err - case consts.DataTypeMapStrSlice: - if !sourceValue.IsObject() { - return nil, ErrDataIsNotObject - } - var res map[string][]any - err := strVal.ToStruct(&res) - return res, err - default: - return nil, errors.New("`" + dataType.String() + "` is not support!") - } -}