Golang的GIN中的JSON响应作为加扰数据返回

时间:2017-12-28 16:27:51

标签: json go go-gin

我根据从数据库中收集的数据创建了一个结构数组。

为简单起见,我们假设这是结构:

type Person struct {
ID        int    `db:"id, json:"id"`
}

type PessoalController struct{}

func (ctrl PessoalController) GetPessoal(c *gin.Context) { 
    q := "select id from rh"

    rows, err := db.GetDB().Query(q)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()

    var pessoas []Pessoal

    var id
    for rows.Next() {
        err := rows.Scan(&id)
        if err != nil {
            log.Fatal(err)
    }
    pessoas = append(pessoas, Pessoal{ ID: id,})

    JsonPessoal, errr := json.Marshal(pessoas)
    if errr != nil {
        log.Fatal(err)
    }
    c.JSON(200, pessoas)
    if err != nil {
        return
    }

    return
}

当我打印它时,我确实得到了我期望的JSON。 但是当我发送回复时,我会看到像“W3siWQiQjlyNDYslNpYx ......”这样的原始数据。

不知道如何继续。

编辑:最小,完整和可验证的示例。

2 个答案:

答案 0 :(得分:4)

c.JSON正在序列化为JSON,所以你应该这样做:

c.JSON(200, pessoas)

答案 1 :(得分:1)

您的代码和问题本身。看看它并在代码中阅读我的评论。

jsonPessoal, errr := json.Marshal(pessoas)
if errr != nil {
    log.Fatal(err)
}
fmt.Fprintf(os.Stdout, "%s", jsonPessoal) // still fine here .
// it is fine because you are formating []byte into string using fmt and 
// printing it on console. `%s` makes sures that it echos as string. 

c.JSON(200, jsonPessoal ) // jsonPessoal is still a []byte !! 
if err != nil {
    return
}

使用gin回显json字符串的正确方法是

c.JSON(http.StatusOK, gin.H{ 
            "code" : http.StatusOK, 
            "message": string(jsonPessoal),// cast it to string before showing
})