亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

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 關注
  • 272 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號