From 4a318f3638dabb8e94533f1122844406eba13b7e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=99=BD=E8=8C=B6=E6=B8=85=E6=AC=A2?= Date: Sun, 1 Dec 2024 18:25:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0ma[any]any/sliceSlice?= =?UTF-8?q?=E6=95=B0=E6=8D=AE=E5=A4=84=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- gjson_hack/precision.go | 80 ++++++++++++++++++++++++++++++++++++----- 1 file changed, 71 insertions(+), 9 deletions(-) diff --git a/gjson_hack/precision.go b/gjson_hack/precision.go index 188300e..662fc35 100644 --- a/gjson_hack/precision.go +++ b/gjson_hack/precision.go @@ -90,6 +90,23 @@ func String(sourceValue gjson.Result, defaultValue string) string { return sourceValueStr } +// MapAnyAny ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 17:48 2024/12/1 +func MapAnyAny(sourceValue gjson.Result) (map[string]any, error) { + if !sourceValue.IsObject() { + return nil, ErrDataIsNotObject + } + res := make(map[string]any) + sourceValue.ForEach(func(key, value gjson.Result) bool { + res[key.String()] = value + return true + }) + return res, nil +} + // Any 获取任意类型的值 // // Author : go_developer@163.com<白茶清欢> @@ -109,12 +126,10 @@ func Any(sourceValue gjson.Result) (any, error) { return res, nil } if sourceValue.IsObject() { - // 对象不管什么类型的key, 统一转成 map[string]any - res := make(map[string]any) - sourceValue.ForEach(func(k, v gjson.Result) bool { - res[k.String()] = v - return true - }) + return MapAnyAny(sourceValue) + } + if sourceValue.IsArray() { + return SliceAny(sourceValue) } return sourceValue.Value(), nil @@ -140,6 +155,28 @@ func getRealDataType(dataType consts.DataType, sourceValue gjson.Result) consts. return dataType } +// SliceAny ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 17:53 2024/12/1 +func SliceAny(gjsonResult gjson.Result) ([]any, error) { + if gjsonResult.Value() == nil { + return nil, nil + } + + strVal := strings.TrimSpace(gjsonResult.String()) + // 任意类型的list + if strings.HasPrefix(strVal, "[") && strings.HasSuffix(strVal, "]") { + // 序列化之后的数组 + sliceVal := wrapper.String(strVal).ToAnySlice() + return sliceVal.Value, sliceVal.Err + } + // 分隔的数组 + sliceVal := wrapper.String(strVal).ToAnySlice(",") + return sliceVal.Value, sliceVal.Err +} + // SliceInt 获取int list // // Author : go_developer@163.com<白茶清欢> @@ -149,7 +186,6 @@ func SliceInt(gjsonResult gjson.Result) ([]int64, error) { if gjsonResult.Value() == nil { return nil, nil } - strVal := strings.TrimSpace(gjsonResult.String()) // 任意类型的list if strings.HasPrefix(strVal, "[") && strings.HasSuffix(strVal, "]") { @@ -272,6 +308,28 @@ func SliceMapStringAny(gjsonResult gjson.Result) ([]map[string]any, error) { return res, nil } +// SliceSlice ... +// +// Author : go_developer@163.com<白茶清欢> +// +// Date : 17:44 2024/12/1 +func SliceSlice(gjsonResult gjson.Result) ([][]any, error) { + if gjsonResult.Value() == nil { + return nil, nil + } + + strVal := strings.TrimSpace(gjsonResult.String()) + // 任意类型的list + if !strings.HasPrefix(strVal, "[") || !strings.HasSuffix(strVal, "]") { + return nil, ErrDataIsNotArray + } + var res [][]any + if err := serialize.JSON.UnmarshalWithNumber([]byte(strVal), &res); nil != err { + return nil, err + } + return res, nil +} + // Value 获取指定的值 // // Author : go_developer@163.com<白茶清欢> @@ -281,6 +339,8 @@ func Value(dataType consts.DataType, sourceValue gjson.Result, defaultValue any) if !sourceValue.Exists() { return defaultValue, nil } + // 归一化处理对象、数组等 + sourceValue = Result(sourceValue) dataType = getRealDataType(dataType, sourceValue) strVal := wrapper.String(sourceValue.String()) switch dataType { @@ -316,8 +376,10 @@ func Value(dataType consts.DataType, sourceValue gjson.Result, defaultValue any) case consts.DataTypeSliceString, consts.DataTypeSliceStringWithChar: // 任意类型的list return SliceString(sourceValue) - case consts.DataTypeSliceSlice, consts.DataTypeMapAnyAny: - return nil, errors.New(consts.DataTypeSliceSlice.String() + " : data type is not support") + case consts.DataTypeSliceSlice: + return SliceSlice(sourceValue) + case consts.DataTypeMapAnyAny: + return MapAnyAny(sourceValue) case consts.DataTypeSliceMapStringAny: return SliceMapStringAny(sourceValue) case consts.DataTypeMapStrInt: