I want to store a certain struct into my database that has a JSON field within it.
type Comp struct {
CompId int64 `db:\"comp_id\" js
I don't know how clean of a solution this is but I ended up making my own data type JSONRaw
. The DB driver sees it as a []btye
but it can still be treated like a json.RawMessage in the Go Code.
type JSONRaw json.RawMessage
func (j JSONRaw) Value() (driver.Value, error) {
byteArr := []byte(j)
return driver.Value(byteArr), nil
}
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
}
func (m *JSONRaw) MarshalJSON() ([]byte, error) {
return *m, nil
}
func (m *JSONRaw) UnmarshalJSON(data []byte) error {
if m == nil {
return errors.New("json.RawMessage: UnmarshalJSON on nil pointer")
}
*m = append((*m)[0:0], data...)
return nil
}
This is copy paste reimplementation of MarshalJSON
and UnmarshalJSON
from the encoding/json
library.