我有一個較大的(10mb)JSON 文件,我試圖將其解組到地圖中,以便在需要時可以從內存中讀取它。我的問題是,我無法弄清楚如何通過 json 中每行的 id 對地圖進行鍵控,即使這是解決問題的慣用方法。它包含很多嵌套數據,但為了簡單起見,它基本上是這樣的:[{"id": "086687173", "count": 5}, {"id": "078382574", "count": 3}]type Item struct { Id string `json:"id"` Count int `json:"count"`}data := []Item // am able to marshal into an arraydata := make(map[string]Item) // cannot unmarshal array into Go value of type map[string]Itembytes, _ := ioutil.ReadFile("./templates/data.json")err := json.Unmarshal(bytes, &data)fmt.Println(data)
1 回答

嚕嚕噠
TA貢獻1784條經驗 獲得超7個贊
我的問題是我不知道如何通過 id 對地圖進行鍵控
您無法為地圖建立索引,因為您沒有任何地圖。
您的輸入 JSON 是一個 JSON 數組,因此您可以將其解組到 Go 切片中。之后你必須自己構建一個 Go 地圖。然后您可以通過以下方式索引該地圖Id:
m := map[string]*Item{}
for i := range data {
m[data[i].Id] = &data[i]
}
fmt.Println(m)
fmt.Println(m["086687173"])
fmt.Println(m["078382574"])
這將輸出(在Go Playground上嘗試):
[{086687173 5} {078382574 3}] <nil>
map[078382574:0x43015c 086687173:0x430150]
&{086687173 5}
&{078382574 3}
請注意,如果您最初使用指針 slice []*Item,則創建映射會更簡單:
m := map[string]*Item{}
for _, item := range data {
m[item.Id] = item
}
輸出是一樣的。在Go Playground上試試這個。
- 1 回答
- 0 關注
- 164 瀏覽
添加回答
舉報
0/150
提交
取消