在 golang 中使用反射从 json 创建对象:将 json 解码为 map[string]interface{}。创建目标对象类型。使用反射将 map[string]interface{} 中的数据填充到目标对象中。使用 typeconversion 函数将值转换为目标对象的字段类型。使用反射设置目标对象的字段值。打印填充后的目标对象。
如何在 Golang 中使用反射从 JSON 创建对象
在 Golang 中,反射提供了在运行时检查和修改程序的类型和值的强大功能。尤其是在处理动态或未知结构的数据时,反射非常有用。
要从 JSON 创建对象,我们可以使用 encoding/json 包和 reflect 包:
立即学习“go语言免费学习笔记(深入)”;
package main import ( "encoding/json" "fmt" "reflect" ) func main() { // 定义 JSON 数据 jsonStr := `{ "name": "John Doe", "age": 30, "occupation": "Software Engineer" }` // 将 JSON 数据解码为 map[string]interface{} var data map[string]interface{} if err := json.Unmarshal([]byte(jsonStr), &data); err != nil { fmt.Println("Error decoding JSON:", err) return } // 创建要填充的目标对象类型 type Person struct { Name string Age int Occupation string } var person Person // 使用反射将 map[string]interface{} 中的数据填充到目标对象中 t := reflect.TypeOf(person) for key, val := range data { // 获取目标对象中与 JSON 字段名称匹配的字段 field, ok := t.FieldByName(key) if !ok { fmt.Printf("Field %s not found in type %sn", key, t.Name()) continue } // 获取字段的类型并将其转换为 val 的类型 fieldType := field.Type fieldValue, err := typeConversion(fieldType, val) if err != nil { fmt.Printf("Error converting value for field %s: %vn", key, err) continue } // 使用反射设置字段值 v := reflect.ValueOf(&person) fieldValuePtr := reflect.ValueOf(fieldValue) v.Elem().FieldByName(key).Set(fieldValuePtr) } // 打印填充后的目标对象 fmt.Println(person) } // 将 val 转换为 type 指定的类型 func typeConversion(t reflect.Type, val interface{}) (value interface{}, err error) { switch t.Kind() { case reflect.String: value = val.(string) case reflect.Int, reflect.Int8, reflect.Int16, reflect.Int32, reflect.Int64: value = int(val.(float64)) case reflect.Float32, reflect.Float64: value = val.(float64) default: err = fmt.Errorf("Unsupported type: %s", t) } return }
实战案例
假设我们有一个 API 返回以下 JSON 响应:
{ "id": 1, "name": "Product A", "price": 100.50, "quantity": 5 }
我们可以使用反射创建一个名为 Product 的 Go 结构体来表示该 JSON 响应:
type Product struct { ID int `json:"id"` Name string `json:"name"` Price float64 `json:"price"` Quantity int `json:"quantity"` }
然后,我们可以使用上面介绍的方法将 JSON 响应解码到 Product 结构体中:
// 将 JSON 响应解码到 map[string]interface{} var data map[string]interface{} if err := json.Unmarshal([]byte(jsonResponse), &data); err != nil { fmt.Println("Error decoding JSON:", err) return } // 创建目标对象 var product Product // 使用反射将数据填充到目标对象中 t := reflect.TypeOf(product) for key, val := range data { field, ok := t.FieldByName(key) if !ok { fmt.Printf("Field %s not found in type %sn", key, t.Name()) continue } fieldType := field.Type fieldValue, err := typeConversion(fieldType, val) if err != nil { fmt.Printf("Error converting value for field %s: %vn", key, err) continue } v := reflect.ValueOf(&product) fieldValuePtr := reflect.ValueOf(fieldValue) v.Elem().FieldByName(key).Set(fieldValuePtr) } fmt.Println(product) // 打印填充后的目标对象
以上就是如何在 Golang 中使用反射从 JSON 创建对象?的详细内容,更多请关注php中文网其它相关文章!
版权声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系 yyfuon@163.com