猿问

sqlx 库提供了奇怪的 base64 编码的外观结果

我正在使用来自http://jmoiron.github.io/sqlx/ 的这个库来进行查询。遵循文档使我找到了下面的代码。


func cities(w http.ResponseWriter, r *http.Request, _ httprouter.Params) error {

    var main string

    var secondary string

    var limit string

    queryParams := make(map[string]interface{})


    if k := r.PostFormValue("keyword"); k != "" {

        main = "city.name LIKE :keyword"

        queryParams["keyword"] = k + "%"

    }


    if sk := r.PostFormValue("secondaryKeyword"); sk != "" && sk != "null" {

        secondary = "OR city.name = :secondaryKeyword"

        queryParams["secondaryKeyword"] = sk

    }


    if mr := r.PostFormValue("maxResults"); mr != "" {

        limit = "LIMIT :maxResults"

        queryParams["maxResults"] = mr

    }


    if lr := r.PostFormValue("lastRequest"); lr != "" && lr == "1" {

        limit = ""

    }


    query := fmt.Sprintf(`

        SELECT

            city.geonameid AS cityId,

            city.name AS cityName,

            COALESCE(admin1.name_local, '') AS admin1Name,

            country.name AS countryName,

            CONCAT_WS(' ', city.name, city.asciiname, country.name) AS searchString

        FROM geonames_cities1000 AS city

            INNER JOIN geonames_countryinfo AS country

                ON city.iso_alpha2 = country.iso_alpha2

            LEFT OUTER JOIN geonames_admin1_codes_ascii as admin1

                ON admin1.code = CONCAT(city.iso_alpha2, '.', city.admin1_code)

        WHERE %s %s

        ORDER BY city.name ASC %s;

    `, main, secondary, limit)


    nstmt, err := sql.DB.PrepareNamed(query)

    if err != nil {

        return err

    }


    rows, err := nstmt.Queryx(queryParams)

    if err != nil {

        return err

    }


    results := []interface{}{}


    for rows.Next() {

        row := make(map[string]interface{})

        err := rows.MapScan(row)

        if err != nil {

            return err

        }

        results = append(results, row)

    }


慕容3067478
浏览 208回答 2
2回答

哔哔one

正如spew.Dump告诉您的那样,SQL 驱动程序返回[]uint8文本列。实际上,它相当于[]byte,json.Marshal编码为 base64 字符串。解决这个问题的最简单方法是将您的行扫描到一个真正的结构中(sqlx 可以很好地处理StructScan),该结构将具有string字段,以便json.Marshal按照您的预期显示它们。您可以使用标签控制字段的 SQL 和 JSON 名称的名称,因此您的实体可以具有每种语言的约定名称……例子:type City struct {    AdminName    string `json:"admin1Name"   sql:"admin1Name"`    CityID       int64  `json:"cityId"       sql:"cityId"`    CityName     string `json:"cityName"     sql:"cityName"`    CountryName  string `json:"countryName"  sql:"countryName"`    SearchString string `json:"searchString" sql:"searchString"`}

翻阅古今

包 encoding/json 将封送[]bytebase64 编码的切片(参见http://golang.org/pkg/encoding/json/#Marshal)。所以问题只是在输出中通过json.Marshal(results).您的代码在某处调用了一个函数,该函数生成了一个[]byte很好地隐藏在其中一个{}interfaces 中的函数。摆脱每个空接口,在适当的地方使用字符串,问题要么消失,要么解决方案显而易见。(json.Marshal出于调试目的而调用和输出结果可能不是一个好主意,尤其是当您并不真正了解实际编组内容时。)
随时随地看视频慕课网APP

相关分类

Go
我要回答