Go:在json响应中从数据库复制各种类型的数据

时间:2014-10-01 00:14:26

标签: json go

我试图从我的数据库中获取一组数据并以json格式返回它们。但是,它们的类型不同,我似乎在我的代码中使用了错误的返回类型。

转到:

type Script struct {
    Id         int    `json:"id"`
    Type       string    `json:"type"`
    Created_at int `json:"created_at"`
}

type AllContent struct {
    New_content     []*Script `json:"new_content,omitempty"`
}

func ReadAllContent() [][]interface{} {
    err := db.Ping()
    if err != nil {
        log.Fatal(err)
}
    rows, err := db.Query("SELECT id, type, created_at FROM script WHERE user_id = $1", user_id)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    var Type string
    var created_at, id int
    for rows.Next() {
        err := rows.Scan(&id, &Type, &created_at)
        if err != nil {
            log.Fatal(err)      
        }
        var a []interface{}
        var b []interface{}
        a = append(a, id, Type, created_at)
        b = append(b, a)
    }
    return b
}

func pingHandler(w http.ResponseWriter, r *http.Request) {

    var s []Script
    resp := AllContent{New_content: []*Script{}}
    m := ReadAllContent()

    for i := 0; i < len(m); i++ {
        s = append(s, Script{Id: m[i][0], Type: m[i][1], Created_at: m[i][2])
    }
    for i := 0; i < len(m); i++ {
        resp.New_content = append(resp.New_content, &s[i])
    }

    w.Header().Set("Content-Type", "application/json")

    js, _ := json.Marshal(resp)
    w.Write(js)
}

我收到此错误:

cannot use m[i][0] (type interface {}) as type int in field value: need type assertion

我应该解决什么?

1 个答案:

答案 0 :(得分:2)

您可以通过添加类型断言来修复编译器错误:

    s = append(s, Script{Id: m[i][0].(int), Type: m[i][1].(string), Created_at: m[i][2].(int))

更好更简单的方法是从ReadAllContent返回一段脚本对象:

func ReadAllContent() []*Script {
    var result []*Script
    err := db.Ping()
    if err != nil {
        log.Fatal(err)
     }

    rows, err := db.Query("SELECT id, type, created_at FROM script WHERE user_id = $1", user_id)
    if err != nil {
        log.Fatal(err)
    }
    defer rows.Close()
    for rows.Next() {
        s := &Script{}
        err := rows.Scan(&s.ID, &s.Type, &s.Created_at)
        if err != nil {
            log.Fatal(err)      
        } 
        result = append(result, s)
    }
    return result
}

然后,您可以将ReadAllContent的返回值直接编码为JSON:

 func pingHandler(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    if err := json.NewEncoder(w).Encode(&AllContent{New_content: ReadAllContent()}); err != nil {
      // handle error
    }
}
相关问题