我在 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 的第一层。
最佳答案
在 Go 中,您可以使用 range
循环遍历 map
,就像遍历 array
或 slice 一样
。范围循环在每次迭代中提供给您的值将是 map 的键及其对应的值。
所以你可以简单地改变你的循环线:
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)
}
Playground 上的例子:https://play.golang.org/p/TKdO5pOJCY
关于 for
with range
的更多信息在这里:https://golang.org/ref/spec#For_range
关于json - 使用 Golang go-simplejson 遍历 Json,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47497959/