【发布时间】:2015-10-27 06:04:10
【问题描述】:
我正处于尝试围绕 Go 进行思考的婴儿阶段。目前,我正在模拟一个 API 请求,该请求返回一个 JSON 格式的字符串,其中包含一个对象数组。我试图找出最合适的方法来遍历每条记录并访问每个字段。最终,每个字段都将写入 Excel 电子表格,但现在我只想打印每个字段的键和值。
这是我所拥有的(我会在 Go Playground 中提供它,但不支持 HTTP 请求):
response, err := http.Get("http://go-proto.robwilkerson.org/demo.json")
failOnError(err, "Uh oh")
defer response.Body.Close()
var view []interface{}
json.NewDecoder(response.Body).Decode(&view)
log.Printf(" [x] Pulled JSON: %s", view)
for _, record := range view {
log.Printf(" [===>] Record: %s", record)
for key, val := range record {
log.Printf(" [========>] %s = %s", key, val)
}
}
一切正常,直到嵌套循环尝试遍历保存每条记录属性的map:
cannot range over record (type interface {})
我想我有两个问题:
- 嵌套循环是访问每个记录的每个属性的最有效/最高效的方法吗?
- 我需要做些什么来解决这个错误?
更新
当我将解码的数据转储到 view 变量中时,这是记录的结果:
[
map[id:ef14912f-8031-42b3-8c50-7aa612287534 avatar:http://placehold.it/32x32 name:Vilma Hobbs email:vilmahobbs@exiand.com phone:+1 (886) 549-3522 address:471 Dahill Road, Jacksonwald, Alabama, 6026]
map[id:1b7bf182-2482-4b8b-8210-9dc9ee51069e avatar:http://placehold.it/32x32 name:Anne Dalton email:annedalton@exiand.com phone:+1 (994) 583-2947 address:660 Macdougal Street, Ticonderoga, Alaska, 7942]
map[id:f8027852-f52e-4bbb-bc9d-fb5e34929b40 avatar:http://placehold.it/32x32 name:Amie Ray email:amieray@exiand.com phone:+1 (853) 508-3649 address:878 Kane Street, Derwood, Minnesota, 3826]
map[id:b9842ab7-5053-48b4-a991-f5c63af8fb7e avatar:http://placehold.it/32x32 name:Hope Benton email:hopebenton@exiand.com phone:+1 (938) 542-2232 address:396 Osborn Street, Rowe, Massachusetts, 702]
map[id:8f9f6d8d-d14e-4ddc-acb2-eb96d3c3d7a8 avatar:http://placehold.it/32x32 name:Janine Kidd email:janinekidd@exiand.com phone:+1 (877) 474-2633 address:173 Manhattan Court, Hall, Virginia, 7376]
map[avatar:http://placehold.it/32x32 name:Kristen Yang email:kristenyang@exiand.com phone:+1 (862) 469-3446 address:203 Doughty Street, Westmoreland, Rhode Island, 849 id:210a6ae6-8227-4f26-a47c-448c400f26e9]
map[name:Murray Sosa email:murraysosa@exiand.com phone:+1 (814) 549-2536 address:811 Kingsland Avenue, Shepardsville, Hawaii, 9117 id:05f4f6af-19af-4b76-9aa8-9352281cf7d9 avatar:http://placehold.it/32x32]
map[phone:+1 (918) 476-2264 address:176 Underhill Avenue, Ebro, Washington, 8099 id:9d21268d-067c-4b16-a6cd-42d184c4c059 avatar:http://placehold.it/32x32 name:Paige Stanton email:paigestanton@exiand.com]
map[id:9946c19f-c226-4ff3-b578-57a249f8d0c7 avatar:http://placehold.it/32x32 name:Melisa Oconnor email:melisaoconnor@exiand.com phone:+1 (908) 429-3915 address:768 Wallabout Street, Cotopaxi, Florida, 3388]
map[id:ee0b82cb-4990-428b-ba36-088287a404ba avatar:http://placehold.it/32x32 name:Monique Poole email:moniquepoole@exiand.com phone:+1 (925) 564-2690 address:232 Hubbard Place, Islandia, Michigan, 3722]
]
【问题讨论】:
-
您不能像错误所说的那样在
interface{}上进行范围,您需要将其声明为可用于范围的类型。 “记录”的底层类型是什么 -
@JimB 这样可以改变。最终它将是查询结果,但是对于任何给定的请求,查询都会有所不同。不同的字段,甚至不同数量的字段。为此,我想我可以将每个字段视为一个字符串值,因为我只是将它们放入电子表格中。这有帮助吗?
-
@JimB:对不起,我应该更仔细地阅读。 AFAICT,每条记录都是
map。我已经用响应中的解码 JSON 更新了帖子。
标签: go