2014-06-11 13 views
12

Tôi là người mới hoàn thành khi di chuyển, bắt đầu vài ngày trước. Tôi muốn kết nối với mongodb, tìm kiếm, tạo một dịch vụ và sử dụng nó cho góc cạnh. Tôi đã làm gần như tất cả mọi thứ nhưng tôi có vấn đề với json.marshal(). Ai đó có thể cho tôi biết tôi đang làm gì sai, hoặc có cách nào tốt hơn không? thx :)Tôi bị kẹt với json.marshal khi di chuyển

Lỗi này là "./main.go:96: nhiều giá trị json.Marshal() trong bối cảnh đơn giá trị"

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 
} 

Trả lời

34

Nhìn vào tài liệu của chức năng này: http://golang.org/pkg/encoding/json/#Marshal

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

Nó trả về hai giá trị. Vấn đề ở đây là bạn chỉ cần cho nó một biến để có được những hai giá trị:

b := json.Marshal(result) 

Vì vậy, bạn chỉ cần phải sửa nó theo cách này:

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

YES, thx người đàn ông bạn đã cứu tôi một vài giờ : DI sẽ chấp nhận câu trả lời của bạn sau vài phút – Arcagully

Các vấn đề liên quan