实现JSON请求数据自动清理空值功能
- 在DoRequest方法中集成JSON数据清理逻辑 - 新增CleanJSON函数用于移除JSON中的空值和0值字段 - 添加递归清理map和slice数据结构的支持 - 实现isEmptyValue函数检测各种类型的空值 - 添加isCleanedValueEmpty函数检查清理后数据是否为空 - 引入gjson库用于JSON编解码操作menu v1.0.7
parent
de77aa78b1
commit
9813be8873
|
|
@ -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)
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue