繁体   English   中英

无法将包含 json 对象列表的字符串类型的数据库字段 StructScan 到 Golang Struct

[英]Unable to StructScan a db field of type string containing list of json objects into Golang Struct

我正在编写一个 go 程序,该程序从 mysql db 中读取值并使用 rows.StructScan 将其解组为 go 结构。 但其中一个字段返回一个字符串,其中包含 json 对象列表。 如果 sqlx 返回 []byte 中的 db 结果,StructScan 应该能够将详细字符串解组为详细结构,但会给出以下错误: name "details": unsupported Scan, storage driver.Value type []uint8 into type *[] main.Details

 import ( _ "github.com/go-sql-driver/mysql" "github.com/jmoiron/sqlx" "github.com/jmoiron/sqlx/reflectx" "encoding/json" ) type Entity struct { ID int `db:"id"` Date *int `db:"date"` Details []Details `db:"details"` } type Details struct { Name *string `json:"name"` Description *string `json:"description"` Code string `json:"code"` } //removed error handling for now dataQuery, args, err:= sqlx.In(DATA_QUERY,IDs) rows, err:= db.Queryx(dataQuery, args...) entityList:= []*Entity{} // 1. Doesn't works for rows.Next() { entity:= &Entity{} err:= rows.StructScan(&entity) entityList = append(entityList, entity) } // 2. works for rows.Next() { entity:= &Entity{} var desc string err:= rows.Scan(&entity.ID,&entity.Date,&desc) err = json.Unmarshal([]byte(desc), &entity.Details) entityList = append(entityList, entity) } // db query result: id: 15 date: 1590177397603 details:[{"name":"Abc","description":"String","code":"CO1"}, {"name":"123","description":"Numbers","code":"CO2"}]

我不想用 2 方法来 go 因为说如果我有很多字段,那么 Scan 会使它看起来很难看并且错过了 StructScan 的优势。 我应该如何执行此操作?

对于JSON类型的列,您的结构字段应该是 []byte 类型,没有其他方法可以解决这个问题。

在这种情况下,我会使用mapscan()方法,扫描后我会通过将其传递给 function 来处理特定密钥,该 function 将 []byte 解组为特定结构或 map。

如果您仍然希望您的结果是结构,请使用某些库将 map 转换为结构。 https://godoc.org/github.com/mitchellh/mapstructure

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM