在golang中从mysql读取json数据?

fjaof16o  于 2021-06-20  发布在  Mysql
关注(0)|答案(2)|浏览(1075)

我面临的情况是,我必须使用用户自己给出的键和值对在数据库中存储动态值。
用户给出键和值,我将其解释为 {"key": "user Given", "value": "user Given"} 我将所有这些东西添加到一个数组中,我希望这个数组被读入go代码,其中对象数组是从数据库表中读取的。

kuhbmx9i

kuhbmx9i1#

您可以使用json unmarshaler接口,但是根据您从mysql检索数据的方式,您的实现会有所不同。但想法是一样的。对于这个例子,我使用https://github.com/go-sql-driver/mysql 假设您想将数据存储在实际的json字段(mysql>=5.7)中,您可以这样做:

type MyField struct {
    Key string `json:"key"`
    Value string `json:"value"`
}

type MyModel struct {
    ID uint64
    MyFieldName MyField `json:"my_field_name"`
}

func (m *MyField) Scan(src interface{}) error {
    // The data stored in a JSON field is actually returned as []uint8
    val := src.([]uint8)
    return json.Unmarshal(val, &m)
}

func main() {
    db, err := sql.Open("mysql", "root:password@tcp(127.0.0.1)/dbname")
    if err != nil {
        panic(err.Error())
    }
    defer db.Close()

    results, err := db.Query("SELECT id, my_field_name FROM my_table")

    if err != nil {
        panic(err.Error())
    }

    for results.Next() {
        var row MyModel
        err := results.Scan(&row.ID, &row.MyFieldName)
        if err != nil {
            panic(err.Error())
        }
        fmt.Println(row.MyFieldName.Key)
    }
}
jv2fixgn

jv2fixgn2#

一种快速的方法,不一定是最优雅的方法,是使用golang的默认json解组器行为来处理golangMap:

jstr := `{"key": "userKeyValue", "value": "userValueValue"}`

// declare a map that has a key string and value interface{} so that any values or
// types will be accepted;
jmap := make(map[string]interface{})

err := json.Unmarshal(jstr, &jmap)
if err != nil {
    log.Fatal(err)
}

for k, v := range jmap {
    fmt.Printf("Key: %v, Value: %v\n", k, v)
    // If you want to directly work with v remember it is an interface{}
    // Thus to use it as a string you must v.(string)
}
// Will output the following:
// Key: key, Value: userKeyValue
// Key: value, Value: userValueValue

您现在可以使用标准的golangMap来操作或管理接收到的数据。。。更优雅的方法是为声明的类型实现json封送处理程序和反封送处理程序接口。这些在golang文件中有描述:https://golang.org/pkg/encoding/json/

相关问题