【问题标题】:Go Gin converting json response to base64Go Gin 将 json 响应转换为 base64
【发布时间】:2020-09-02 22:11:34
【问题描述】:

我正在尝试将数据库查询数据作为 json 响应发送。这是我的控制器:

import (
    "fmt"
    "github.com/json-iterator/go"
    "log"
)

func GetNewsPapers()  []byte{
    db := GetDB()

    var json = jsoniter.ConfigCompatibleWithStandardLibrary

    rows, err := db.Queryx(`SELECT title, language, ranking, slug, search_term, logo_url FROM public.news_newspaper`)
    if err != nil {
        log.Println(err)
    }

    defer rows.Close()
    tableData := make([]map[string]interface{}, 0)

    for rows.Next() {
        entry := make(map[string]interface{})
        err := rows.MapScan(entry)
        if err != nil {
            log.Println(err)
        }
        tableData = append(tableData, entry)
    }

    jsonData, _ := json.Marshal(tableData)

    fmt.Println(string(jsonData))  // printing expected json
    err = rows.Err()
    if err != nil {
        panic(err)
    }
    return jsonData
}

func (n *NewsPaperController) GetList(c *gin.Context) {
    value := database.GetNewsPapers()
    c.JSON(http.StatusOK, value)
}

问题是我得到 base64 字符串作为响应,而不是我期望的 json 对象。如果我将value 转换为如下所示的字符串,我会得到人类可读的值。

c.JSON(http.StatusOK, string(value))

但是整个响应以这样的字符串编码:

"[{\"language\":\"en\",\"logo_url\":\"..\",\"ranking\":2,\"search_term\":\"..\",\"slug\":\"..\",\"title\":\"....\"}]

我如何获得如下的 json 响应:

 [{"language":"en","logo_url":"..","ranking":2,"search_term":"..","slug":"..","title":".."} ] 

【问题讨论】:

  • 你应该只决定一个:我要自己使用json.Marshal来编组这个吗?还是我要把编组留给杜松子酒并使用c.JSON?但是你不应该两者都做,封送已经封送的 json 字节是没有意义的。
  • @mkopriva 哪个性能更好?
  • 它们是相同的,杜松子酒在引擎盖下使用 json.Marshal。但既然你使用的是杜松子酒,你应该使用杜松子酒。

标签: json go go-gin encoding-json-go


【解决方案1】:

func (c *Context) JSON(code int, obj interface{})

JSON 序列化 将结构作为 JSON 给定到响应正文中。它还设置了 内容类型为“application/json”。

c.JSON() 序列化为 JSON,使用前无需解组。在c.JSON() 中使用tableData

func GetNewsPapers()  []map[string]interface{}{
    // your existing code
    return tableData
}

func (n *NewsPaperController) GetList(c *gin.Context) {
    value := database.GetNewsPapers()
    c.JSON(http.StatusOK, value)
}

使用%#v,您可以看到值的 Go 语法表示,您还会在其中找到转义字符

fmt.Printf("%#v", string(jsonData))

【讨论】:

    猜你喜欢
    • 2022-08-23
    • 2017-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-04
    • 2019-09-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多