feature/upgrade_filter #7
169
filter.go
169
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!")
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user