首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >panic:接口转换:接口{}是[]接口{},而不是map[string]接口{}

panic:接口转换:接口{}是[]接口{},而不是map[string]接口{}
EN

Stack Overflow用户
提问于 2022-10-17 17:57:13
回答 1查看 208关注 0票数 -3

我在GO中有一个简单的程序来解析JSON:

代码语言:javascript
复制
package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    jsonData := `{"aaa": {"bbb": {"ccc": [{"file_1": "file.jpg", "file_2": "file.png"}]}}}`

    var result map[string]map[string]map[string]interface{}
    json.Unmarshal([]byte(jsonData), &result)

    files := result["aaa"]["bbb"]["ccc"].(map[string]interface{})

    for key, value := range files {
        fmt.Println(key, value)
    }
}

https://go.dev/play/p/dxv8k4pI7uX

我希望收到文件列表,因此响应应该是:

file_1 file.jpg file_2 file.png

但是这段代码返回了错误:

代码语言:javascript
复制
panic: interface conversion: interface {} is []interface {}, not map[string]interface {}

我做错什么了?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-17 18:10:00

result["aaa"]["bbb"]["ccc"]的类型是[]interface{},因为json有一个映射数组。

一种解决方案是更改result的声明以匹配json模式:

代码语言:javascript
复制
var result map[string]map[string]map[string][]map[string]string

或者,您可以保留对interface{}的定义,但是在每个级别上都有其他步骤来执行类型断言:

代码语言:javascript
复制
var result map[string]map[string]map[string]interface{}
json.Unmarshal([]byte(jsonData), &result)

fileList := result["aaa"]["bbb"]["ccc"].([]interface{})

for _, fileI := range fileList {
    for key, value := range fileI.(map[string]interface{}) {
        fmt.Println(key, value.(string))
    }
}

编辑:第二种方法与上面评论中的@icza相同。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74101312

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档