猿问

将非结构化 JSON BYTEA 扫描到 map[string]string

这似乎是一个常见问题,可能已经在某个地方发布了,但我找不到任何讨论它的线程,所以这里是问题:


我有一个存储类型列的 Postgres 表BYTEA。


CREATE TABLE foo (

  id         VARCHAR PRIMARY KEY,

  json_data  BYTEA

)

该列json_data实际上只是 JSON 存储为BYTEA(我知道这并不理想)。它是非结构化的,但保证是string -> stringJSON。


当我查询此表时,我需要将查询扫描SELECT * FROM foo WHERE id = $1到以下结构中:


type JSONData map[string]string


type Foo struct {

  ID    string   `db:"id"`

  Data  JSONData `db:"json_data"`

}

我正在使用sqlx的Get方法。当我执行查询时,我收到错误消息sql: Scan error on column index 1, name "json_data": unsupported Scan, storing driver.Value type []uint8 into type *foo.JSONData。


显然,扫描器无法将 JSON 扫描BYTEA到地图中。我可以实现我自己的扫描仪并在列上调用我的自定义扫描仪json_data,但我想知道是否有更好的方法来做到这一点。我的JSONData类型可以实现现有接口来自动执行此操作吗?


慕丝7291255
浏览 125回答 1
1回答

www说

正如@iLoveReflection 所建议的那样,在工作中实现Scanner接口*JSONData。这是实际的实现:func (j *JSONData) Scan(src interface{}) error {    b, ok := src.([]byte)    if !ok {        return errors.New("invalid data type")    }    return json.Unmarshal(b, j)}
随时随地看视频慕课网APP

相关分类

Go
我要回答