uberrebu
uberrebu

Reputation: 4329

How do I print sql rows in JSON using golang?

I understand how to return JSON using the gorilla/mux go package but i want to be able to print JSON also in development without having to wrap it to route endpoint

I have the following code and want to list users from postgresql database

package main

import (
    "encoding/json"
    "fmt"
    "gorm.io/driver/postgres"
    "gorm.io/gorm"
)

var DB *gorm.DB
var err error


const DNS = "host=localhost user=postgres_user password=postgres_password dbname=postgres_db port=5432 sslmode=disable"


type User struct {
    gorm.Model
    FirstName string `json:"firstname"`
    LastName  string `json:"lastname"`
    Email     string `json:"email"`
}

func PostgresTest() {
    DB, err = gorm.Open(postgres.Open(DNS), &gorm.Config{})
    if err != nil {
        fmt.Println(err.Error())
        panic("Cannot connect to DB")
    }
    
    var users []User
    
    DB.Limit(2).Find(&users)
    // json.NewEncoder(w).Encode(users)
    fmt.Println(json.Marshal(users))

}

func main() {
    PostgresTest()
}

here is what am expecting

[
    {
        "ID": 1,
        "CreatedAt": "2021-09-06T14:18:47.766414-05:00",
        "UpdatedAt": "2021-09-06T14:18:47.766414-05:00",
        "DeletedAt": null,
        "firstname": "first1",
        "lastname": "last1",
        "email": "[email protected]"
    },
    {
        "ID": 2,
        "CreatedAt": "2021-09-06T14:18:58.144181-05:00",
        "UpdatedAt": "2021-09-06T14:18:58.144181-05:00",
        "DeletedAt": null,
        "firstname": "first2",
        "lastname": "last2",
        "email": "[email protected]"
    }
]

but here is what am getting

[91 123 34 73 68 34 58 49 44 34 67 114 101 97 116 101 100 65 116 34 58 34 50 48 50 49 45 48 57 45 48 54 84 48 55 58 50 49 58 49 51 46 53 52 50 54 55 50 45 48 53 58 48 48 34 44 34 85 112 100 97 116 101 100 65 116 34 58 34 50 48 50 49 45 48 57 45 48 54 84 48 55 58 50 49 58 49 51 46 53 52 50 54 55 50 45 48 53 58 48 48 34 44 34 68 101 108 101 116 101 100 65 116 34 58 110 117 108 108 44 34 102 105 114 115 116 110 97 109 101 34 58 34 98 97 98 97 116 117 110 100 101 34 44 34 108 97 115 116 110 97 109 101 34 58 34 98 117 115 97 114 105 34 44 34 101 109 97 105 108 34 58 34 98 98 117 115 97 114 105 64 101 109 97 105 108 46 99 111 109 34 125 93] <nil>

What do i do to be able to print JSON or list of JSON?

Upvotes: 0

Views: 1036

Answers (2)

Jaroslaw
Jaroslaw

Reputation: 656

json.Marshal function returns []byte thus what you see in the output is a decimal representation of each byte from your JSON result. You must convert []byte returned by json.Marshal to string either directly like this

jsonUsers, err := json.Marshal(users)
if err != nil {
  log.Fatal(err)
}
fmt.Println(string(jsonUsers))

or by using formatter

jsonUsers, err := json.Marshal(users)
if err != nil {
  log.Fatal(err)
}
fmt.Printf("%s", jsonUsers)

I also advise you to read encoding/json package documentation when you can find how to pretty format JSON.

Upvotes: 2

Jackstine
Jackstine

Reputation: 484

use string(jsonbytecode)

type B struct {
    C int
    D int
}
    
func main() {
    b := B{C: 4, D: 5}
    js, _ := json.Marshal(b)
    fmt.Println(js)
    fmt.Println(string(js))
}

Here is the output, the string(js) converts to JSON

[123 34 67 34 58 52 44 34 68 34 58 53 125]
{"C":4,"D":5}

Upvotes: 0

Related Questions