【问题标题】:Loop over Json using Golang go-simplejson使用 Golang go-simplejson 循环 Json
【发布时间】:2017-11-26 15:49:37
【问题描述】:

我在 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 中,您可以像遍历数组一样遍历地图,而不是 index, value 组合,您将从 := range map 获得 key, value

标签: json go


【解决方案1】:

在 Go 中,您可以使用 range 循环遍历 map,就像遍历 arrayslice 一样。 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

更多关于forrange的信息在这里:https://golang.org/ref/spec#For_range

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 2021-07-01
    • 2017-07-07
    • 2011-01-16
    • 1970-01-01
    • 1970-01-01
    • 2014-12-16
    相关资源
    最近更新 更多