JSON response in Golang’s GIN returning as scrambled data
26,148
Solution 1
c.JSON
is serializing into JSON, so you should be doing:
c.JSON(200, pessoas)
Solution 2
Your codes ans the question itself. Look at it and read my comments in the code.
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
}
The correct way to echo json string using gin would be
c.JSON(http.StatusOK, gin.H{
"code" : http.StatusOK,
"message": string(jsonPessoal),// cast it to string before showing
})
Author by
Auyer
Updated on July 09, 2022Comments
-
Auyer almost 2 years
I have array of a struct being created from data I collected from the database.
For simplicity, lets say this is the struct:
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 }
When I print it, I do get the JSON I expected. But when I send the response, I get raw-looking data like “W3siWQiQjlyNDYslNpYx...”
Have no idea how to proceed.
Edit : Minimal, Complete, and Verifiable example.