从API的SQL结果创建JSON

时间:2016-03-02 17:18:46

标签: json go

我是Go的新手,所以希望这很容易解决。我想从SQL数据库中的行构建JSON值。它不一定是SQL,但我正在寻找一种方法来生成结构列表或一个容器,它包含许多值以便从中生成JSON。

例如,对" / post"的HTTP GET请求会回来:

{
  "posts": [
    { "title": "First title", "created_by": "User1" },
    { "title": "My second post", "created_by": "User1"}
  ]
}

我不知道这样做的正确方法是什么。我已经尝试过使用指针数组的其他方法,但它没有正确出来。到目前为止,它打印出每个结构的正确值,但结果Marshal为空[{},{},{}]

请放轻松我:)

example.go

package main

import (
    "fmt"
    "encoding/json"
    "time"
    "database/sql"
    _ "github.com/go-sql-driver/mysql"
)


type Post struct {
    name string `json:"name"`
    created_by string `json:"created_by"`
    created_at time.Time `json:"created_at"`
}

type Posts []Post

func main() {

    db, err := sql.Open("mysql", "root:1234@/blog?parseTime=true")
    if err != nil { panic(err.Error()) }
    defer db.Close()

    err = db.Ping()
    if err != nil { panic(err.Error()) }

    rows, err := db.Query("select title, created_by, created_at from post")
    if err != nil { panic(err.Error()) }
    defer rows.Close()

    var posts Posts
    for rows.Next() {            
        var post Post
        err := rows.Scan(&post.name, &post.created_by, &post.created_at)
        if err != nil { panic(err.Error()) }
        fmt.Printf("name=%s, created_by=%s, created_at=%s\n", post.name, post.created_by, post.created_at)
        posts = append(posts, post)                  
    }    

    data, err := json.Marshal(posts)    
    if err != nil { panic(err.Error()) }
    fmt.Printf("%s\n", data)
}

1 个答案:

答案 0 :(得分:1)

您的字段未导出,因此json包无法看到它们。

有关更长的解释和其他常见问题,请参阅50 Shades of Go