The encoding/json package uses reflection (reflect package) to access fields of structs. You need to export the fields of your struct to make it work (start them with an uppercase letter):
type Book struct {
Isbn string
Title string
Author string
Price float32
}
And when scanning:
err := rows.Scan(&bk.Isbn, &bk.Title, &bk.Author, &bk.Price)
Quoting from json.Marshal():
Struct values encode as JSON objects. Each exported struct field becomes a member of the object...