go - 在golang中迭代列表json对象

标签 go

我有这段代码来读取 JSON 对象。我需要轻松迭代“outputs”/data/concepts 键中的所有元素。

有更好的方法吗?

另外,如何访问 value 的属性: value.app_id、value.id 等

代码:

package main

import (
    "encoding/json"
    "fmt"
)

var jsonBytes = []byte(`
{"outputs": [{
          "data": {"concepts": 
                                 [{"app_id": "main",
                                     "id": "ai_GTvMbVGh",
                                     "name": "ancient",
                                     "value": 0.99875855}]
              }}
              ],
 "status": {"code": 10000, "description": "Ok"}}`)


func main() {
    var output map[string]interface{}
    err := json.Unmarshal([]byte(jsonBytes), &output)
    if err != nil {
        print(err)
    }
    for _, value := range output["outputs"].([]interface{}) {
        //fmt.Println(value.(map[string]interface{})["data"].(map[string]interface{})["concepts"]).([]interface{})
        //fmt.Println(value.(map[string]interface{})["data"].(map[string]interface{})["concepts"])
        for _, value := range value.(map[string]interface{})["data"].(map[string]interface{})["concepts"].([]interface{}){
            fmt.Println(value)
        }
    }
    //fmt.Printf("%+v\n", output)
}

最佳答案

最好的方法是将 JSON 解码为结构并迭代值,

func main() {

        var output StructName


err := json.Unmarshal([]byte(jsonBytes), &output)
    if err != nil {
        print(err)
    }
    for _, value := range output.Outputs {
        for _, val := range value.Data.Concepts {
            fmt.Printf("AppId:%s\nID:%s\nname:%s\nvalue:%f", val.AppID, val.ID, val.Name, val.Value)
        }
    }
}

type StructName struct {
    Outputs []struct {
        Data struct {
            Concepts []struct {
                AppID string  `json:"app_id"`
                ID    string  `json:"id"`
                Name  string  `json:"name"`
                Value float64 `json:"value"`
            } `json:"concepts"`
        } `json:"data"`
    } `json:"outputs"`
    Status struct {
        Code        int    `json:"code"`
        Description string `json:"description"`
    } `json:"status"`
}

关于go - 在golang中迭代列表json对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51814804/

相关文章:

string - 使用 String() 方法的 Go 接口(interface)

go - 将字符串从一种奇怪的格式转换为 float

golang + Godeps : Adding new dependency override Godeps. json文件

beego 中的 golang 单例

go - 需要了解 goroutines

angular - 使用 go 提供 Angular dist 文件夹

reflection - golang可以将参数数量未知的函数作为另一个函数的参数吗

go - 如何以正确的方式组织你的 Go 项目?

go - 如何根据父列有条件地预加载子项?

go - 如何在 golang net/http 中使用 Transport 添加 header 信息