gorm: json of json 不工作

gorm: json of json not work

样本:

{
  "id": 1
  "data": {"1": 2}
}

结构定义:

type Item struct {
  id int `json:"id"`
  data interface{} `json:"data"`
}

我需要从一个httppost解析payload,所以我用interface{}代替datajson.Unmarshal()成功了,但是gorm在调用db.Create(item):

(sql: converting Exec argument #5's type: unsupported type map[string]interface {}, a map)

相反,我从 interface{} 更改为 string,调用 json.Unmarshal() 解析 json POST 有效载荷产生错误。

unmarshal type error: expected=string, got=object

基本上,一个需要interface{},一个需要string

有人遇到过这个吗?

解决方案是定义一个实现 sql.Valuersql.Scannerjson.Marshalerjson.Unmarshaler 接口的自定义类型。我的实施示例:

type Data string

func (t *Data) MarshalJSON() ([]byte, error) {
    return []byte(*t), nil
}

func (t *Data) UnmarshalJSON(data []byte) error {
    *t = Data(data)
    return nil
}

func (t Data) Value() (driver.Value, error) {
    return string(t), nil
}

func (t *Data) Scan(src interface{}) error {
    s, ok := src.([]byte)
    if !ok {
        return nil
    }
    *t = Data(s)
    return nil
}

// Data implements the below interfaces to satisfy both
// json parser and sql parser
var _ json.Marshaler = (*Data)(nil)
var _ json.Unmarshaler = (*Data)(nil)
var _ sql.Scanner = (*Data)(nil)
var _ driver.Valuer = (*Data)(nil)