使用Golang go-simplejson遍历Json

时间:2017-11-26 15:49:38

标签: json go

我在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的第一级循环更感兴趣。

1 个答案:

答案 0 :(得分:2)

在Go中,您可以使用range循环迭代map,方法与arrayslice相同。每次迭代的范围循环提供给您的值将是地图的键及其对应的值。

所以你可以简单地改变你的循环线:

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