为什么 Json Unmarshall 在 Golang 中改变数组类型?

我正在尝试在功能上播种我的 Postgres 数据库。在我的例子中,SeedSchema() 函数可以采用任何类型的结构。所以我定义了一个接口并为我的结构创建了函数,它将播种。我尝试过使用泛型和不使用泛型。


当我将文件中的任何 json 数组解组为字节数组时,json.Unmarshall 方法更改我的结构的 tempMember 成员。Exp,models.Term 到 map[string]interface{}。我在这个函数之前使用过 unmarshall,但我没有见过这样的情况。


这是我的 SeedSchema() 函数:


func (db *Database) SeedSchema(models ...globals.Seeder[any]) error {

var (

    subjects []globals.Seeder[any]

    fileByte []byte

    err      error

    // tempMember any

)

if len(models) == 0 {

    subjects = seederModelList

} else {

    subjects = models

}

for _, model := range subjects {

    fileName, tempMember := model.Seed()

    fmt.Printf("%+v\n", reflect.TypeOf(tempMember)) //1

    if fileByte, err = os.ReadFile("db/seeds/" + fileName); err != nil {

        fmt.Println(err)

        return err

    }

    if err = json.Unmarshal(fileByte, &tempMember); err != nil {

        fmt.Println(err)

        return err

    }

    fmt.Printf("%+v\n", reflect.TypeOf(tempMember)) //2


}

return nil 

}

第一个打印返回 []models.AirportCodes 和第二个 []interface {}。


这是我的界面和模型:


func (AirportCodes) Seed() (string, any) {

    return "airport_codes.json", []AirportCodes{}

}


type Seeder[T any] interface {

    Seed() (string, T)

    // Seed(*gorm.DB) error

    TableName() string

}


seederModelList = []globals.Seeder[any]{

        m.AirportCodes{},

        m.Term{},

    }


Helenr
浏览 120回答 1
1回答

呼如林

几周后,我一直在寻找解决这个问题的方法,并查看 unmarshaler 接口和示例。然后就像icza所说的那样,我开始查看类型之间约定的代码,然后我就这样解决了。如果你们有比我更好的答案,请添加答案。数据:[    {        "id":1,        "name":"Term 1",        "content": [            "a1",            "a2",            "a3"        ]    }]结果:[{ID:1 Name:Term 1 Content:[a1 a2 a3]}]UnmarshalJSON 函数:func (term *Term) UnmarshalJSON(data []byte) error {    tempMap := map[string]interface{}{}    if err := json.Unmarshal(data, &tempMap); err != nil {        return err    }    *term = Term{        Name: tempMap["name"].(string),    }    if tempMap["content"] != nil {        for _, v := range tempMap["content"].([]interface{}) {            (*term).Content = append((term).Content, v.(string))        }    }    return nil}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go