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

标签 sql json go

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

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

CREATE TABLE foo (
  id         VARCHAR PRIMARY KEY,
  json_data  BYTEA
)

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

查询这张表时,需要扫描查询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 时遇到问题。成 map 。我可以实现自己的扫描仪并在 json_data 上调用我的自定义扫描仪列,但我想知道是否有更好的方法来做到这一点。我的 JSONData类型实现现有接口(interface)自动执行此操作?

最佳答案

正如@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)
}

关于sql - 将非结构化 JSON BYTEA 扫描到 map[string]string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60496684/

相关文章:

php - 我可以在另一个文件中运行 sql 查询吗?

mysql - SQL:将信息连接到主表中

mysql - SQL : How do I sum all null values into another value of specific row?

java - Jackson 自定义序列化器 : change object to be a simple property and value in containing object

amazon-web-services - AWS S3 预签名 URL 策略

sql - 使用 case 创建多列数据

java - 如何在 Java(服务器端)中对 JSONArray 中的 JSONObject 进行排序?

cJSON.h : No such file or directory

go - 在 golang 中通过 TCP 套接字发送数百万条短消息

go - 无效操作 : a > b (operator > not defined on interface)