mirror of
https://github.com/jefferyjob/go-easy-utils.git
synced 2025-10-23 14:53:28 +08:00
jsonutils optimization (#43)
This commit is contained in:
@@ -4,7 +4,6 @@ import (
|
|||||||
"encoding/json"
|
"encoding/json"
|
||||||
"errors"
|
"errors"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
"strings"
|
"strings"
|
||||||
)
|
)
|
||||||
@@ -48,32 +47,12 @@ func JsonToStruct(jsonData string, result any) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
switch fieldValue.Kind() {
|
switch fieldValue.Kind() {
|
||||||
case reflect.String:
|
case reflect.String, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
||||||
fieldValue.SetString(toStringReflect(value))
|
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
reflect.Float32, reflect.Float64, reflect.Bool:
|
||||||
val, err := toInt64Reflect(value)
|
if err := parsePrimitiveValue(fieldValue, value); err != nil {
|
||||||
if err != nil {
|
|
||||||
log.Printf("toInt64Reflect err:%s \n", err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
fieldValue.SetInt(val)
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
||||||
val, err := toUint64Reflect(value)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("toUint64Reflect err:%s \n", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fieldValue.SetUint(val)
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
val, err := toFloat64Reflect(value)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("toFloat64Reflect err:%s \n", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
fieldValue.SetFloat(val)
|
|
||||||
case reflect.Bool:
|
|
||||||
val := toBoolReflect(value)
|
|
||||||
fieldValue.SetBool(val)
|
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
if subData, ok := value.(map[string]any); ok {
|
if subData, ok := value.(map[string]any); ok {
|
||||||
subResult := reflect.New(fieldValue.Type())
|
subResult := reflect.New(fieldValue.Type())
|
||||||
|
@@ -3,7 +3,6 @@ package jsonUtil
|
|||||||
import (
|
import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"log"
|
|
||||||
"reflect"
|
"reflect"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -45,43 +44,22 @@ func parseSlice(fieldValue reflect.Value, subData []any) error {
|
|||||||
} else {
|
} else {
|
||||||
// 否则,将项目转换为适当的类型并设置元素值
|
// 否则,将项目转换为适当的类型并设置元素值
|
||||||
switch elem.Kind() {
|
switch elem.Kind() {
|
||||||
case reflect.String:
|
case reflect.String, reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64,
|
||||||
elem.SetString(toStringReflect(item))
|
reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64,
|
||||||
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
|
reflect.Float32, reflect.Float64, reflect.Bool:
|
||||||
val, err := toInt64Reflect(item)
|
err := parsePrimitiveValue(elem, item)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Printf("toInt64Reflect err:%s \n", err)
|
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
elem.SetInt(val)
|
|
||||||
case reflect.Uint, reflect.Uint8, reflect.Uint16, reflect.Uint32, reflect.Uint64:
|
|
||||||
val, err := toUint64Reflect(item)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("toUint64Reflect err:%s \n", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
elem.SetUint(val)
|
|
||||||
case reflect.Float32, reflect.Float64:
|
|
||||||
val, err := toFloat64Reflect(item)
|
|
||||||
if err != nil {
|
|
||||||
log.Printf("toFloat64Reflect err:%s \n", err)
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
elem.SetFloat(val)
|
|
||||||
case reflect.Bool:
|
|
||||||
val := toBoolReflect(item)
|
|
||||||
elem.SetBool(val)
|
|
||||||
default:
|
default:
|
||||||
return fmt.Errorf("unsupported slice element type: %s", elemType.String())
|
return fmt.Errorf("unsupported slice element type: %s", elemType.String())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 将元素附加到切片
|
slice = reflect.Append(slice, elem) // 将元素附加到切片
|
||||||
slice = reflect.Append(slice, elem)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 将切片值设置为目标字段
|
fieldValue.Set(slice) // 将切片值设置为目标字段
|
||||||
fieldValue.Set(slice)
|
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user