go - 在golang中迭代列表json对象
问题描述
我有这段代码来读取 JSON 对象。我需要轻松地遍历 'outputs'/data/concepts 键中的所有元素。
有更好的方法吗?
另外,如何访问 value 的属性:value.app_id、value.id..etc
代码:
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"`
}
推荐阅读
- css - 为什么位置会发生变化?
- android - 有没有办法在 android 中使用 DownloadManager 通过 LAN 下载?
- php - 使用 fetch api 和 laravel 在查询字符串参数中出现奇怪的双问号
- python-3.x - 使用生成器时如何修复 tribonacci 级数函数
- javascript - 跨多个文件的 Google Drive 评论是否有一个 API 端点?
- c++ - 制作目标 .moc 不需要规则
- javascript - 将 promise 函数转换为 async/await
- docker - 如何在本地 Docker 映像上看到额外的标签?
- html - 之前有宽度和换行符的 span 元素
- gradle - 如果dependsOn任务之一失败,如何继续执行Gradle