lkl_sdk/lklsdk/common/json_cleaner.go

117 lines
2.7 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

package common
import (
"reflect"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/os/gctx"
"github.com/gogf/gf/v2/os/glog"
)
// CleanJSON 清理JSON字符串中的空值和0值字段
func CleanJSON(jsonStr string) ([]byte, error) {
// 解析为JSON
//var data interface{}
json := gjson.NewWithOptions(jsonStr, gjson.Options{StrNumber: true})
glog.Infof(gctx.New(), "Cleaning JSON: %+v", json)
// 递归清理数据
cleaned := cleanData(json.Interface())
jsons, err := gjson.DecodeToJson(cleaned, gjson.Options{StrNumber: true})
if err != nil {
glog.Errorf(gctx.New(), "Error decoding JSON: %v", err)
return nil, err
}
return jsons.ToJson()
}
// 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
}