2016-03-02 6 views
0

Я очень новичок, поэтому надеюсь, что это просто исправить. Я хочу построить значение JSON из строк в базе данных SQL. Это не должен быть SQL, но я ищу способ создания списка структур или контейнера, который содержит много значений, чтобы генерировать JSON.Создайте JSON из результата SQL для API

Например, запрос HTTP GET для «/ пост» вернется:

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

Я не знаю, что это правильный способ сделать это. Я пробовал другие способы, используя массив указателей, но это не получается правильно. До сих пор она выдает правильные значения для каждой структуры, но в результате маршал пуст [{},{},{}]

Пожалуйста, полегче на меня :)

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:[email protected]/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) 
} 
+0

Я просто пытался маршалировать одну почту, и это тоже не работает. Я что-то упускаю. – incognick

ответ

1

Ваши поля не являются экспортируется, поэтому пакет json их не видит.

См. 50 Shades of Go для более подробного объяснения и других распространенных ошибок.

+0

Wow .... это выбор дизайна нечетного языка – incognick

+0

Ну, нераскрытое поле является «частным» эквивалентом других языков, поэтому абсолютно нормальный другой пакет не может его увидеть. В противном случае это противоречило бы определению атрибута 'private' ... – Elwinar

+0

Я имел в виду использование стиля (Капитализация), чтобы изменить поведение, а не ключевое слово (личное, как вы сказали), или символ (язык Nim использует *). Просто что-то понять при изучении нового языка :) – incognick

Смежные вопросы