将JSON文件打包为地图

时间:2019-06-25 14:37:37

标签: arrays json dictionary go slice

我有一个较大的(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 array
data := make(map[string]Item) // cannot unmarshal array into Go value of type map[string]Item


bytes, _ := ioutil.ReadFile("./templates/data.json")
err := json.Unmarshal(bytes, &data)

fmt.Println(data)

1 个答案:

答案 0 :(得分:3)

  

我的问题是我不知道如何通过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}

请注意,如果您最初使用的是指针切片[]*Item,则创建地图会更加简单:

m := map[string]*Item{}
for _, item := range data {
    m[item.Id] = item
}

输出是相同的。在Go Playground上尝试这个。