2014-03-28 61 views
2

我無法弄清楚如何在Go中解碼這個JSON。該地圖返回nil。 Unmarshal從內存中工作,但最終我可能需要一個流。另外,我需要獲得Foo,Bar和Baz的關鍵名稱。不確定那個。Golang - 你如何解碼json數組並獲得root屬性

JSON:

{ 

    "Foo" : {"Message" : "Hello World 1", "Count" : 1}, 
    "Bar" : {"Message" : "Hello World 2", "Count" : 0}, 
    "Baz" : {"Message" : "Hello World 3", "Count" : 1} 

} 

代碼:

package main 

import (
    "encoding/json" 
    "fmt" 
    "os" 
) 

type Collection struct { 
    FooBar map[string]Data 
} 
type Data struct { 
    Message string `json:"Message"` 
    Count int `json:"Count"` 
} 

func main() { 

    //will be http 
    file, err := os.Open("stream.json") 
    if err != nil { 
     panic(err) 
    } 

    decoder := json.NewDecoder(file) 

    var c Collection 

    err = decoder.Decode(&c) 
    if err != nil { 
     panic(err) 
    } 

    for key, value := range c.FooBar { 
     fmt.Println("Key:", key, "Value:", value) 
    } 
    //returns empty map 
    fmt.Println(c.FooBar) 

} 

回答

3

你並不需要一個頂級結構,直接解碼成圖:

err = decoder.Decode(&c.FooBar) 

或者,直接刪除結構:

type Collection map[string]Data 

使用您的頂級結構,隱含格式爲:

{ 
    "FooBar": { 
    "Foo" : {"Message" : "Hello World 1", "Count" : 1}, 
    "Bar" : {"Message" : "Hello World 2", "Count" : 0}, 
    "Baz" : {"Message" : "Hello World 3", "Count" : 1} 
    } 
}