欧美一区二区三区,国内熟女精品熟女A片视频小说,日本av网,小鲜肉男男GAY做受XXX网站

json 反射

錢斌斌2年前9瀏覽0評論

JSON反射是指使用反射技術(shù)來處理JSON字符串,從中提取數(shù)據(jù),并將其轉(zhuǎn)換為對象。這個過程中需要使用到Go語言自帶的encoding/json包和反射包。如下面的示例所示:

import (
"encoding/json"
"reflect"
)
func  UnmarshalJSON(data []byte, v interface{}) error {
// 解析JSON字符串
if err := json.Unmarshal(data, &v); err != nil {
return err
}
val := reflect.ValueOf(v)
// 如果解析得到的不是指針類型,則拋出異常
if val.Kind() != reflect.Ptr || val.IsNil() {
return errors.New("UnmarshalJSON: 非法參數(shù)")
}
// 獲取指針所指向的對象的類型
targetType := reflect.TypeOf(v).Elem()
return unmarshalJSON(val.Elem(), targetType)
}
func unmarshalJSON(val reflect.Value, targetType reflect.Type) error {
// 如果目標類型是結(jié)構(gòu)體,則遍歷它的字段
if targetType.Kind() == reflect.Struct {
for i := 0; i < targetType.NumField(); i++ {
field := targetType.Field(i)
tag := field.Tag.Get("json")
// 如果tag為空,則忽略該字段
if tag == "" {
continue
}
// 解析該字段所對應的JSON的值
jsonValue := findJSONValue(val, tag)
// 將JSON的值賦給該字段
if err := setValue(val.Field(i), jsonValue); err != nil {
return err
}
}
}
return nil
}
func findJSONValue(val reflect.Value, tag string) reflect.Value {
// 獲取指針所指向的對象的類型
targetType := val.Type()
// 遍歷類型對應的字段,查找tag對應的字段
for i := 0; i < targetType.NumField(); i++ {
field := targetType.Field(i)
if field.Tag.Get("json") == tag {
return val.Field(i)
}
}
return reflect.Value{}
}
func setValue(field reflect.Value, jsonValue reflect.Value) error {
// 將JSON的值賦給該字段
switch field.Kind() {
case reflect.String:
field.SetString(jsonValue.String())
case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64:
return setInt(field, jsonValue)
case reflect.Float32, reflect.Float64:
return setFloat(field, jsonValue)
case reflect.Bool:
field.SetBool(jsonValue.Bool())
default:
// 如果該字段的類型未知,則拋出異常
return errors.New("UnmarshalJSON: 未知類型")
}
return nil
}
func setInt(field reflect.Value, jsonValue reflect.Value) error {
// 轉(zhuǎn)換JSON的值到整數(shù)類型
int64Value, err := strconv.ParseInt(jsonValue.String(), 10, field.Type().Bits())
if err != nil {
return err
}
// 確保JSON的值可以賦給該字段
if !field.OverflowInt(int64Value) {
field.SetInt(int64Value)
return nil
}
return errors.New("UnmarshalJSON: 整數(shù)越界")
}
func setFloat(field reflect.Value, jsonValue reflect.Value) error {
// 轉(zhuǎn)換JSON的值到浮點類型
floatValue, err := strconv.ParseFloat(jsonValue.String(), field.Type().Bits())
if err != nil {
return err
}
// 確保JSON的值可以賦給該字段
if !field.OverflowFloat(floatValue) {
field.SetFloat(floatValue)
return nil
}
return errors.New("UnmarshalJSON: 浮點數(shù)越界")
}

上面的代碼解析了一個JSON字符串,并將其轉(zhuǎn)換為結(jié)構(gòu)體對象。首先使用json包解析JSON字符串,并將其反序列化為一個interface{}類型的值,然后使用反射包來遍歷該值,將數(shù)據(jù)賦給結(jié)構(gòu)體中的字段。