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{}
代替data
,json.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.Valuer
、sql.Scanner
、json.Marshaler
和 json.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)
样本:
{
"id": 1
"data": {"1": 2}
}
结构定义:
type Item struct {
id int `json:"id"`
data interface{} `json:"data"`
}
我需要从一个httppost解析payload,所以我用interface{}
代替data
,json.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.Valuer
、sql.Scanner
、json.Marshaler
和 json.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)