2 回答

TA贡献1810条经验 获得超5个赞
您可以使用此站点http://json2struct.mervine.net/根据结果获得正确的结构。只需复制选择结果,并生成您体面的结构
或者您可以生成具有项目结构数组的新类型:
type Projects []Project

TA贡献1998条经验 获得超6个赞
我从这个答案中使用下面的这个解决方案使它工作
我不知道这是一个多么干净的解决方案,但我最终制作了自己的数据类型JSONRaw。DB 驱动程序将其视为 a,[]btye但json.RawMessage在 Go 代码中仍可将其视为 a 。
这是一个复制粘贴重新实现MarshalJSON,并UnmarshalJSON从编码/ JSON库。
//JSONRaw ...
type JSONRaw json.RawMessage
//Value ...
func (j JSONRaw) Value() (driver.Value, error) {
byteArr := []byte(j)
return driver.Value(byteArr), nil
}
//Scan ...
func (j *JSONRaw) Scan(src interface{}) error {
asBytes, ok := src.([]byte)
if !ok {
return error(errors.New("Scan source was not []bytes"))
}
err := json.Unmarshal(asBytes, &j)
if err != nil {
return error(errors.New("Scan could not unmarshal to []string"))
}
return nil
}
//MarshalJSON ...
func (j *JSONRaw) MarshalJSON() ([]byte, error) {
return *j, nil
}
//UnmarshalJSON ...
func (j *JSONRaw) UnmarshalJSON(data []byte) error {
if j == nil {
return errors.New("json.RawMessage: UnmarshalJSON on nil pointer")
}
*j = append((*j)[0:0], data...)
return nil
}
//Project ....
type Project struct {
ID int64 `db:"project_id, primarykey, autoincrement" json:"id"`
UserID int64 `db:"user_id" json:"user_id"`
Name string `db:"name" json:"name"`
Status int `db:"status" json:"status"`
UpdatedAt int64 `db:"updated_at" json:"updated_at"`
CreatedAt int64 `db:"created_at" json:"created_at"`
Apps JSONRaw `json:"apps"`
}
但我想知道除此之外是否还有干净的方法?
希望这也能帮助其他人。
- 2 回答
- 0 关注
- 287 浏览
添加回答
举报