在Golang中从MySql读取Json数据?

时间:2018-07-18 06:20:11

标签: mysql json database go web

我正面临一种情况,我必须使用用户本身给出的键和值对将动态值存储在数据库中。

用户提供键和值,我将其解释为

{"key": "user Given", "value": "user Given"}

我将所有这些东西添加到一个数组中,我希望将此数组读入Go代码中,在该代码中,从数据库表中读取了对象数组

2 个答案:

答案 0 :(得分:1)

您可以使用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)
    }
}

答案 1 :(得分:0)

快速攻克(不一定是最优雅的方法)是对Golang映射使用Golang的默认JSON Unmarshaler行为:

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

您现在可以使用标准的golang映射来操纵或管理接收到的数据...更为优雅的方法是为您声明的类型实现JSON Marshaler和Unmarshaler接口。这些在golang文档中进行了描述:https://golang.org/pkg/encoding/json/