2016-06-29 5 views
3

私は自分のpostgresデータベースからいくつかのデータを取り出して、それらをjsonとしてlocalhost/dbに印刷しようとしています。私はjsonなしで印刷に成功していますが、私はjsonでそれらを必要としています。結果として空のJsonを印刷します

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

This is what I get when I access 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}] 

誰もが問題が何であるかを知っていますか?

答えて

6

encoding/jsonパッケージは、構造体のフィールドにアクセスするためにリフレクション(reflectパッケージ)を使用します。あなたは(大文字でそれらを起動する)それを動作させるためにあなたの構造体のフィールドをエクスポートする必要があります。

type Book struct { 
    Isbn string 
    Title string 
    Author string 
    Price float32 
} 

とスキャン:

json.Marshal()から引用
err := rows.Scan(&bk.Isbn, &bk.Title, &bk.Author, &bk.Price) 

構造体の値はJSONオブジェクトとしてエンコードされます。各エクスポートされた構造体フィールドは、オブジェクトのメンバーになります。

+0

@SaidSaifi編集済みの回答を参照してください。あなたは、大文字でフィールド名を始める必要があります。 – icza

+0

ありがとう、私はアップグレードし、あなたの答えを受け入れたが、私は15の評判に達したときにのみ表示されます:) –