为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
Helenr 2023-02-06 18:59:45
我正在尝试在功能上播种我的 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{},    }
查看完整描述

1 回答

?
呼如林

TA贡献1798条经验 获得超3个赞

几周后,我一直在寻找解决这个问题的方法,并查看 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

}


查看完整回答
反对 回复 2023-02-06
  • 1 回答
  • 0 关注
  • 119 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信