0

サンプル:

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

構造体の定義:

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

http 投稿からペイロードを解析する必要があるため、interface{}forを使用すると成功しますが、呼び出し中に gorm がエラーを生成します。datajson.Unmarshal()db.Create(item)

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

代わりに、 から に変更し、 json POST ペイロードを解析するために呼び出すとエラーが発生しinterface{}ますstringjson.Unmarshal()

unmarshal type error: expected=string, got=object

基本的に、人は を必要とinterface{}し、人は を必要としstringます。

誰もこれに遭遇しましたか?

4

1 に答える 1

1

sql.Valuer解決策は、、、およびインターフェイスsql.Scannerを実装するカスタム タイプを定義することです。私の実装のサンプル:json.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)
于 2016-12-15T03:53:55.840 に答える