filter.getValue => gjson_hack.Value

This commit is contained in:
白茶清欢 2024-12-02 11:36:03 +08:00
parent 4a318f3638
commit 7214767a90

169
filter.go
View File

@ -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!")
}
}