diff --git a/lklsdk/common/client.go b/lklsdk/common/client.go index 4c6e80b..52deba3 100644 --- a/lklsdk/common/client.go +++ b/lklsdk/common/client.go @@ -15,6 +15,7 @@ import ( "time" "github.com/black1552/base-common/utils" + "github.com/gogf/gf/v2/encoding/gjson" "github.com/gogf/gf/v2/os/gfile" "github.com/gogf/gf/v2/util/gconv" ) @@ -91,8 +92,16 @@ func (c *Client[T]) loadPrivateKey() (*rsa.PrivateKey, error) { // DoRequest 发送HTTP请求 func (c *Client[T]) DoRequest(url string, reqData interface{}) (*T, error) { + jsonStr, err := gjson.EncodeString(reqData) + if err != nil { + return nil, fmt.Errorf("请求参数转JSON字符串失败: %v", err) + } + reqJson, err := CleanJSON(jsonStr) + if err != nil { + return nil, fmt.Errorf("清理JSON空值失败: %v", err) + } // 序列化为JSON - jsonData, err := json.Marshal(reqData) + jsonData, err := json.Marshal(reqJson) if err != nil { return nil, fmt.Errorf("序列化请求数据失败: %v", err) } diff --git a/lklsdk/common/json_cleaner.go b/lklsdk/common/json_cleaner.go new file mode 100644 index 0000000..33d46c9 --- /dev/null +++ b/lklsdk/common/json_cleaner.go @@ -0,0 +1,118 @@ +package common + +import ( + "encoding/json" + "reflect" +) + +// CleanJSON 清理JSON字符串中的空值和0值字段 +func CleanJSON(jsonStr string) (string, error) { + var data interface{} + + // 解析JSON字符串 + if err := json.Unmarshal([]byte(jsonStr), &data); err != nil { + return "", err + } + + // 递归清理数据 + cleaned := cleanData(data) + + // 转换回JSON字符串 + result, err := json.Marshal(cleaned) + if err != nil { + return "", err + } + + return string(result), nil +} + +// cleanData 递归清理map或slice中的空值和0值 +func cleanData(data interface{}) interface{} { + if data == nil { + return nil + } + + v := reflect.ValueOf(data) + + switch v.Kind() { + case reflect.Map: + cleanedMap := make(map[string]interface{}) + for _, key := range v.MapKeys() { + val := v.MapIndex(key) + if val.Interface() != nil && !isEmptyValue(val) { + cleanedVal := cleanData(val.Interface()) + // 只有清理后的值不为空才添加 + if !isCleanedValueEmpty(cleanedVal) { + cleanedMap[key.String()] = cleanedVal + } + } + } + return cleanedMap + + case reflect.Slice: + cleanedSlice := make([]interface{}, 0) + for i := 0; i < v.Len(); i++ { + item := v.Index(i) + if item.Interface() != nil && !isEmptyValue(item) { + cleanedItem := cleanData(item.Interface()) + if !isCleanedValueEmpty(cleanedItem) { + cleanedSlice = append(cleanedSlice, cleanedItem) + } + } + } + // 如果slice为空,则返回nil而不是空slice + if len(cleanedSlice) == 0 { + return nil + } + return cleanedSlice + + default: + return data + } +} + +// isEmptyValue 检查值是否为空值或0值 +func isEmptyValue(v reflect.Value) bool { + switch v.Kind() { + case reflect.Interface, reflect.Ptr: + return v.IsNil() + case reflect.Slice, reflect.Map: + return v.Len() == 0 + case reflect.String: + return v.String() == "" || v.String() == "0" + case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: + return v.Int() == 0 + case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64: + return v.Uint() == 0 + case reflect.Float32, reflect.Float64: + return v.Float() == 0 + case reflect.Bool: + return !v.Bool() + } + + // 特殊处理nil值 + if !v.IsValid() { + return true + } + + return false +} + +// isCleanedValueEmpty 检查清理后的值是否为空 +func isCleanedValueEmpty(val interface{}) bool { + if val == nil { + return true + } + + v := reflect.ValueOf(val) + switch v.Kind() { + case reflect.Map: + return v.Len() == 0 + case reflect.Slice: + return v.Len() == 0 + case reflect.String: + return val == "" + } + + return false +}