Reputation: 2971
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.
Upvotes: 8
Views: 60361
Reputation: 1679
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
})
Upvotes: 6
Reputation: 64705
c.JSON
is serializing into JSON, so you should be doing:
c.JSON(200, pessoas)
Upvotes: 23