在 golang 中使用反射从 json 创建对象:将 json 解码为 map[string]interface{}。创建目标对象类型。使用反射将 map[string]interface{} 中的数据填充到目标对象中。使用 typeconversion 函数将值转换为目标对象的字段类型。使用反射设置目标对象的字段值。打印填充后的目标对象。

如何在 Golang 中使用反射从 JSON 创建对象
在 Golang 中,反射提供了在运行时检查和修改程序的类型和值的强大功能。尤其是在处理动态或未知结构的数据时,反射非常有用。
要从 JSON 创建对象,我们可以使用 encoding/json 包和 reflect 包:
立即学习“go语言免费学习笔记(深入)”;
Easily find JSON paths within JSON objects using our intuitive Json Path Finder
30
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 %s\n", key, t.Name())
continue
}
// 获取字段的类型并将其转换为 val 的类型
fieldType := field.Type
fieldValue, err := typeConversion(fieldType, val)
if err != nil {
fmt.Printf("Error converting value for field %s: %v\n", 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 %s\n", key, t.Name())
continue
}
fieldType := field.Type
fieldValue, err := typeConversion(fieldType, val)
if err != nil {
fmt.Printf("Error converting value for field %s: %v\n", key, err)
continue
}
v := reflect.ValueOf(&product)
fieldValuePtr := reflect.ValueOf(fieldValue)
v.Elem().FieldByName(key).Set(fieldValuePtr)
}
fmt.Println(product) // 打印填充后的目标对象以上就是如何在 Golang 中使用反射从 JSON 创建对象?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号