如何用Golang解析嵌套JSON并获取指定result_rows数据?
解决Go中嵌套JSON的result_rows数据提取问题
你当前代码无法访问result_rows的核心问题是结构体定义不完整:既没有声明对应字段,也没通过json标签和JSON中的小写字段做映射,同时result_rows里的元素是混合类型数组,需要针对性处理。
修改后的完整代码
package main import ( "encoding/json" "fmt" ) type PoliticsJson struct { Status string Output []struct { Name string Results []struct { Name string `json:"name"` Result_Headers []string `json:"result_headers"` ResultRows [][]interface{} `json:"result_rows"` // 用interface{}接收混合类型数组 } `json:"Results"` } `json:"output"` } func main() { s := `{ "status": "pass", "output": [ { "Name": "example", "ExecutionTime": "2021-08-22T10:23:10.775986761Z", "Passed": false, "Results": [ { "name": "name1", "description": "desc1", "result_headers": [ "name", "types", "times" ], "result_rows": [ [ "insta-a", { "Elements": [ "x-aaaa", "x-bbbb" ], "Dimensions": [ { "Length": 2, "LowerBound": 1 } ], "Status": 2 }, { "Elements": [ { "Time": "2021-07-28T20:01:47Z", "Status": 2, "InfinityModifier": 0 }, { "Time": "2021-07-28T19:24:33Z", "Status": 2, "InfinityModifier": 0 } ], "Dimensions": [ { "Length": 2, "LowerBound": 1 } ], "Status": 2 } ], [ "insta-b", { "Elements": [ "x-eeee", "x-ffff" ], "Dimensions": [ { "Length": 2, "LowerBound": 1 } ], "Status": 2 }, { "Elements": [ { "Time": "2021-07-18T06:18:15Z", "Status": 2, "InfinityModifier": 0 }, { "Time": "2021-08-17T12:20:33Z", "Status": 2, "InfinityModifier": 0 } ], "Dimensions": [ { "Length": 2, "LowerBound": 1 } ], "Status": 2 } ], [ "insta-c", { "Elements": [ "x-tttt", "x-yyyy" ], "Dimensions": [ { "Length": 2, "LowerBound": 1 } ], "Status": 2 }, { "Elements": [ { "Time": "2021-08-10T07:57:32Z", "Status": 2, "InfinityModifier": 0 }, { "Time": "2021-08-10T07:56:45Z", "Status": 2, "InfinityModifier": 0 } ], "Dimensions": [ { "Length": 2, "LowerBound": 1 } ], "Status": 2 } ] ], "type": "manual", "check_passed": false } ], "Error": "", "Loaded": null } ] }` var p PoliticsJson err := json.Unmarshal([]byte(s), &p) if err != nil { panic(err) } // 提取首个Results元素的result_rows数据 firstResult := p.Output[0].Results[0] for _, row := range firstResult.ResultRows { // 提取insta名称 instaName, _ := row[0].(string) // 提取Elements数组 elementMap, _ := row[1].(map[string]interface{}) elements, _ := elementMap["Elements"].([]interface{}) // 格式化输出目标内容 fmt.Printf("%s %s,%s\n", instaName, elements[0], elements[1]) } }
关键修改说明
结构体字段与标签:
- 新增
ResultRows字段并添加json:"result_rows"标签,让Go能正确解析JSON中的小写字段; - 用
[][]interface{}定义ResultRows,适配result_rows的混合类型数组结构。
- 新增
数据提取逻辑:
- 遍历
result_rows的每一行,通过类型断言将interface{}转换为字符串、map类型; - 提取每行第一个元素作为insta名称,第二个元素中的
Elements数组作为目标值。
- 遍历
运行代码后会输出你需要的内容:
insta-a x-aaaa,x-bbbb insta-b x-eeee,x-ffff insta-c x-tttt,x-yyyy
内容的提问来源于stack exchange,提问作者user1234845
相关产品推荐
相关产品推荐

