我在Golang工作,并使用包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的第一级循环更感兴趣。
答案 0 :(得分:2)
在Go中,您可以使用range
循环迭代map
,方法与array
或slice
相同。每次迭代的范围循环提供给您的值将是地图的键及其对应的值。
所以你可以简单地改变你的循环线:
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
的更多信息,请访问https://golang.org/ref/spec#For_range