我在戈朗工作,并使用包github.com/bitly/go-simplejson
我将从客户端接收一个Json,我已经使用该包构造了json对象。现在,我需要遍历Json的所有“第一级”元素。Json是这样的:
{"Name":"demo2","Creator":"some creator","URL":"www.url.com","GACode":"UA-xxxx"} 我的代码是:
body, _ := ioutil.ReadAll(req.Body)
settings,_ := simplejson.NewJson(body)
fmt.Printf("\nJson: %+v",settings)
for k, v := range settings.MustArray() {
fmt.Println("\n k:",k)
fmt.Println("\n v:",v)
}当我打印Json时,我收到:
Json: &{data:map[Name:demo2 Creator:some creator URL:www.url.com GACode:UA-xxxx]}循环没有给我任何东西,MustArray()给了我一个空数组。json的键是非常动态的,所以我不能做像.Get("TheKey")这样的事情,因为我不知道Json中可以出现的键的名称。
那我怎么才能翻过那个Json呢?我对Json的第一级更感兴趣。
发布于 2017-11-26 16:17:07
在Go中,您可以使用range循环对map进行迭代,就像在array或slice上一样。range循环在每次迭代中提供给您的值将是映射的键及其相应的值。
因此,您可以简单地从以下位置更改循环行:
for k, v := range settings.MustArray() {至:
for k, v := range settings.MustMap() {此外,就我个人而言,我建议放弃simplejson,除非您有比示例中更好的用例。在我看来,使用标准的encoding/json,您可以用较少的努力就可以获得相同的结果。
var settings map[string]interface{}
if err := json.NewDecoder(req.Body).Decode(&settings); err != nil {
panic(err)
}
fmt.Printf("\nJson: %+v",settings)
for k, v := range settings {
fmt.Println("\n k:",k)
fmt.Println("\n v:",v)
}操场上的例子:https://play.golang.org/p/TKdO5pOJCY
关于for和range的更多信息,在这里:range
https://stackoverflow.com/questions/47497959
复制相似问题