jsonutils optimization (#43)

This commit is contained in:
jeffery
2023-05-12 19:04:20 +08:00
committed by GitHub
parent da0e416c8d
commit ffe9c42a54
2 changed files with 10 additions and 53 deletions

View File

@@ -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())

View File

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