2014-06-11 51 views
12

Birkaç gün önce başladı, yeni başlayanlar tamamlandı. Ben mongodb'a bağlanmak, arama yapmak, hizmet oluşturmak ve onu açısal olarak kullanmak istiyorum. Neredeyse her şeyi yaptım ama json.marshal() ile sorunum var. Birisi bana neyi yanlış yaptığımı söyleyebilir mi, yoksa daha iyi bir yolu var mı? thx :)Ben json.marshal ile gidiyorum

hatadır "./main.go:96: Birden çok değerli tek değerli bağlamında json.Marshal()" Bu işlevin belgelerine

package main 

import (
    "encoding/json" 
    "flag" 
    "fmt" 
    "github.com/gorilla/mux" 
    "labix.org/v2/mgo" 
    "labix.org/v2/mgo/bson" 
    "log" 
    "net/http" 
) 

type warrior struct { 
    Name  string  `json:"name"` 
    LowDamage int   `json:"low_damage"` 
    HighDamage int   `json:"high_damage"` 
    Health  int   `json:"health"` 
    HealthLeft int   `json:"health_left"` 
    Armor  int   `json:"armor"` 
    Id   bson.ObjectId "_id,omitempty" 
} 

func getWarriors(w http.ResponseWriter, r *http.Request) { 
    w.Header().Set("Content-Type", "application/json") 
    w.WriteHeader(200) 
    w.Write(mongo()) 
} 

func main() { 

    // command line flags 
    port := flag.Int("port", 5001, "port to serve on") 
    dir := flag.String("random message 1", "web/", "random message 2") 
    flag.Parse() 

    // handle all requests by serving a file of the same name 
    fs := http.Dir(*dir) 
    fileHandler := http.FileServer(fs) 

    // ROUTES 
    router := mux.NewRouter() 
    router.Handle("/", http.RedirectHandler("/static/", 302)) 
    router.HandleFunc("/warriors", getWarriors).Methods("GET") 
    router.PathPrefix("/static/").Handler(http.StripPrefix("/static", fileHandler)) 
    http.Handle("/", router) 

    log.Printf("Running on port %d\n", *port) 

    addr := fmt.Sprintf("127.0.0.1:%d", *port) 
    err := http.ListenAndServe(addr, nil) 
    fmt.Println(err.Error()) 
} 

func mongo() []byte { 

    session, err := mgo.Dial("mongodb://localhost:27017/test") 
    if err != nil { 
     panic(err) 
    } 
    defer session.Close() 

    // Optional. Switch the session to a monotonic behavior. 
    session.SetMode(mgo.Monotonic, true) 

    // select dm + table name 
    c := session.DB("test").C("warriors") 

    e := warrior{ 
     Name:  "first event", 
     LowDamage: 2, 
     HighDamage: 4, 
     Health:  40, 
     HealthLeft: 40, 
     Armor:  1, 
    } 

    // insert data 
    err = c.Insert(e) 
    if err != nil { 
     panic(err) 
    } 

    // search show results []warrior{} for all warrior{} 
    result := []warrior{} 
    // err = c.Find(bson.M{"name": "first event"}).One(&result) 
    err = c.Find(bson.M{"name": "first event"}).Limit(10).All(&result) 
    if err != nil { 
     panic(err) 
    } 

    b := json.Marshal(result) 

    log.Println("JSON:", result) 
    return b 
} 

cevap

34

Görünüş: http://golang.org/pkg/encoding/json/#Marshal

func Marshal(v interface{}) ([]byte, error) 

İki değer döndürür.

b, err := json.Marshal(result) 
+1

EVET, thx adam bana bir kaç saat kurtardı: Yani sadece bu şekilde düzeltmek zorunda

b := json.Marshal(result) 

: Buradaki sorun sadece o bu iki değeri elde etmek için bir değişken vermesidir : Cevabınızı birkaç dakika içinde kabul edeceğim – Arcagully