我试图从我的postgres数据库中检索一些数据,并将它们打印localhost/db为json。我成功地在没有json的情况下打印了它们,但我在json中需要它们。
localhost/db
main.go:
package main import ( "database/sql" "encoding/json" "fmt" "log" "net/http" _ "github.com/lib/pq" ) type Book struct { isbn string title string author string price float32 } var b []Book func main() { db, err := sql.Open("postgres", "postgres://****:****@localhost/postgres?sslmode=disable") if err != nil { log.Fatal(err) } rows, err := db.Query("SELECT * FROM books") if err != nil { log.Fatal(err) } defer rows.Close() var bks []Book for rows.Next() { bk := new(Book) err := rows.Scan(&bk.isbn, &bk.title, &bk.author, &bk.price) if err != nil { log.Fatal(err) } bks = append(bks, *bk) } if err = rows.Err(); err != nil { log.Fatal(err) } b = bks http.HandleFunc("/db", getBooksFromDB) http.ListenAndServe("localhost:1337", nil) } func getBooksFromDB(w http.ResponseWriter, r *http.Request) { fmt.Println(b) response, err := json.Marshal(b) if err != nil { panic(err) } fmt.Fprintf(w, string(response)) }
这是我访问localhost:1337 / db时得到的
这是终端上的输出:
[{978-1503261969 Emma Jayne Austen 9.44} {978-1505255607 The Time Machine H. G. Wells 5.99} {978-1503379640 The Prince Niccolò Machiavelli 6.99}]
有人知道是什么问题吗?
该encoding/json包使用反射(reflect结构的包),以存取字段。您需要导出结构的字段以使其起作用(以大写字母开头):
encoding/json
reflect
type Book struct { Isbn string Title string Author string Price float32 }
扫描时:
err := rows.Scan(&bk.Isbn, &bk.Title, &bk.Author, &bk.Price)
引用自json.Marshal():
json.Marshal()
结构值编码为JSON对象。每个 导出的struct字段都 成为对象的成员。