为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕容3067478 2021-11-08 14:37:02
我正在使用来自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)    }
查看完整描述

2 回答

?
哔哔one

TA贡献1854条经验 获得超8个赞

正如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"`

}


查看完整回答
反对 回复 2021-11-08
?
翻阅古今

TA贡献1780条经验 获得超5个赞

包 encoding/json 将封送[]bytebase64 编码的切片(参见http://golang.org/pkg/encoding/json/#Marshal)。所以问题只是在输出中通过json.Marshal(results).

您的代码在某处调用了一个函数,该函数生成了一个[]byte很好地隐藏在其中一个{}interfaces 中的函数。摆脱每个空接口,在适当的地方使用字符串,问题要么消失,要么解决方案显而易见。

json.Marshal出于调试目的而调用和输出结果可能不是一个好主意,尤其是当您并不真正了解实际编组内容时。)


查看完整回答
反对 回复 2021-11-08
  • 2 回答
  • 0 关注
  • 207 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信