Files
go-easy-utils/jsonUtil/parse_slice.go
jeffery bbe169cba0 fix:parse slices (#37)
1. Does not support parsing map type
2. Parse the slice type, if the data type is inconsistent, panic error

close #35
2023-05-11 17:41:34 +08:00

82 lines
2.0 KiB
Go

package jsonUtil
import (
"encoding/json"
"fmt"
"log"
"reflect"
)
func parseSlice(fieldValue reflect.Value, subData []any) error {
if fieldValue.Kind() != reflect.Slice {
return ErrNotSlice
}
// 获取切片元素类型
elemType := fieldValue.Type().Elem()
// 创建一个与目标字段相同类型的新切片
slice := reflect.MakeSlice(fieldValue.Type(), 0, len(subData))
// 迭代 subData 切片的元素
for _, item := range subData {
// 创建 slice 元素类型的新元素
elem := reflect.New(elemType).Elem()
// 如果元素类型是结构体,则递归调用 JsonToStruct
if elem.Kind() == reflect.Struct {
// 将项目转换为 JSON 字符串
jsonData, err := json.Marshal(item)
if err != nil {
return err
}
// 调用 JsonToStruct 将 JSON 字符串解析为 struct 元素
err = JsonToStruct(string(jsonData), elem.Addr().Interface())
if err != nil {
return err
}
} else {
// 否则,将项目转换为适当的类型并设置元素值
switch elem.Kind() {
case reflect.String:
elem.SetString(toStringReflect(item))
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
val, err := toInt64Reflect(item)
if err != nil {
log.Printf("toInt64Reflect err:%s \n", 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:
return fmt.Errorf("unsupported slice element type: %s", elemType.String())
}
}
// 将元素附加到切片
slice = reflect.Append(slice, elem)
}
// 将切片值设置为目标字段
fieldValue.Set(slice)
return nil
}