如何使用 golang 在 JSON 中打印 sql 行?

How do I print sql rows in JSON using golang?

我了解如何 return JSON 使用 gorilla/mux go 包,但我希望能够在开发中打印 JSON 而不必将其包装到路由端点

我有以下代码,想列出来自 postgresql 数据库的用户

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()
}

这是我期待的

[
    {
        "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": "first1.last1@email.com"
    },
    {
        "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": "first2.last2@email.com"
    }
]

但这就是我得到的

[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>

我该怎么做才能打印 JSON 或 JSON 的列表?

使用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))
}

这是输出,string(js) 转换为 JSON

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

json.Marshal 函数 returns []byte 因此您在输出中看到的是 JSON 结果中每个字节的十进制表示。您必须将 json.Marshal 返回的 []byte 直接转换为字符串

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

或使用格式化程序

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

我还建议您阅读 encoding/json 软件包文档,以便找到如何 pretty format JSON.