Storing Golang JSON into Postgresql

前端 未结 3 1270
深忆病人
深忆病人 2021-02-07 09:57

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         


        
3条回答
  •  后悔当初
    2021-02-07 10:19

    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.

提交回复
热议问题