如何解决动态创建JSON对象
以下是用于从JSON提取自定义结构类型的工作代码。它使用UnmarshalJSON()创建对象数组。这可以进一步简化吗,因为JSON文件中的车辆列表会增加,并且有一种方法可以不使用switch语句创建对象。
JSON文件数据: { “车辆”: [ “汽车”, “卡车” ] }
代码:
package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"os"
"reflect"
)
type driveAPI interface {
drive()
}
type car struct{}
func (car) drive() {
fmt.Println("Driving a car")
}
type truck struct{}
func (truck) drive() {
fmt.Println("Driving a truck")
}
type vehicle struct {
Value []driveAPI
}
func (v *vehicle) UnmarshalJSON(data []byte) error {
var typ struct {
Type []string `json:"vehicle"`
}
if err := json.Unmarshal(data,&typ); err != nil {
return err
}
fmt.Println("Vehicle Type",typ.Type)
for _,t := range typ.Type {
switch t {
case "car":
fmt.Println("car new")
v.Value = append(v.Value,new(car))
case "truck":
fmt.Println("truck new")
v.Value = append(v.Value,new(truck))
}
}
return nil
}
func main() {
jsnFile,err := os.Open("users.json")
if err != nil {
fmt.Println(err)
}
fmt.Println("Succefully Opened file")
defer jsnFile.Close()
byteValue,_ := ioutil.ReadAll(jsnFile)
vh := new(vehicle)
if err := json.Unmarshal([]byte(byteValue),&vh); err != nil {
panic(err)
}
fmt.Println(reflect.TypeOf(vh.Value))
for _,r := range vh.Value {
r.drive()
}
}
解决方法
使用类型注册表:
var registeredTypes=map[string]func() driveAPI{}
func init() {
registeredTypes["car"]=func() driveAPI {return &car{}}
registeredTypes["truck"]=func() driverAPI {return &truck{}}
}
...
for _,t := range typ.Type {
if f,ok:=registeredTypes[t]; ok {
v.Value = append(v.Value,f())
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。