实现JSON请求数据自动清理空值功能

- 在DoRequest方法中集成JSON数据清理逻辑
- 新增CleanJSON函数用于移除JSON中的空值和0值字段
- 添加递归清理map和slice数据结构的支持
- 实现isEmptyValue函数检测各种类型的空值
- 添加isCleanedValueEmpty函数检查清理后数据是否为空
- 引入gjson库用于JSON编解码操作
menu v1.0.7
maguodong 2025-10-16 15:26:47 +08:00
parent de77aa78b1
commit 9813be8873
2 changed files with 128 additions and 1 deletions

View File

@ -15,6 +15,7 @@ import (
"time" "time"
"github.com/black1552/base-common/utils" "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/os/gfile"
"github.com/gogf/gf/v2/util/gconv" "github.com/gogf/gf/v2/util/gconv"
) )
@ -91,8 +92,16 @@ func (c *Client[T]) loadPrivateKey() (*rsa.PrivateKey, error) {
// DoRequest 发送HTTP请求 // DoRequest 发送HTTP请求
func (c *Client[T]) DoRequest(url string, reqData interface{}) (*T, error) { 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 // 序列化为JSON
jsonData, err := json.Marshal(reqData) jsonData, err := json.Marshal(reqJson)
if err != nil { if err != nil {
return nil, fmt.Errorf("序列化请求数据失败: %v", err) return nil, fmt.Errorf("序列化请求数据失败: %v", err)
} }

View File

@ -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
}