json - 使用 Golang go-simplejson 遍历 Json

标签 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 的第一层。

最佳答案

在 Go 中,您可以使用 range 循环遍历 map,就像遍历 arrayslice 一样。范围循环在每次迭代中提供给您的值将是 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/

相关文章:

javascript - Knockout.js 将 observable 与单个 json 对象绑定(bind)

json - 将对象转换为键值对数组

go - 从url存储图像时如何编写RIFF block 头?

json - 自定义 MarshalJSON() 永远不会在 Go 中被调用

Java使用GSON处理一段json

c# - 在 C# 中按两个属性对 JSON 数据进行分组

enums - 类型常量声明列表

json - 将 json 成员字段包装到对象

android - 使用 ActiveAndroid 库存储 HashMap<String, Object>

Go SMB2 ,阅读和列出目录