【问题标题】:Golang interface conversion error when trying to iterate through map of json array尝试遍历json数组的映射时出现Golang接口转换错误
【发布时间】:2017-03-30 15:16:00
【问题描述】:

当我尝试遍历某个 json 的映射时遇到问题。

原始 JSON 数据如下所示:

"dataArray": [
    {
      "name": "default",
      "url": "/some/url"
    },
    {
      "name": "second",
      "url": "/another/url"
    }
]

地图如下所示:

[map[name:default url:/some/url] map[name:second url:/another/url]]

代码如下:

for _, urlItem := range item.(map[string]interface{}){
   do some stuff
}

这通常在它是 JSON 对象时有效,但这是 JSON 中的一个数组,我收到以下错误:

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

任何帮助将不胜感激

【问题讨论】:

  • 为什么不只是标记一些结构并以理智的方式解组 JSON?
  • 我会的,但有时数据在那里,有时不在那里,所以我需要在数据进入之前对其进行测试。这很痛苦,但如果没有数据可以进入数组,则保存该数组的字段不存在。
  • 你的意思是JSON中的字段不存在?在这种情况下,您可以只检查 nil。

标签: json loops go


【解决方案1】:

错误是:

恐慌:接口转换:接口{}是[]接口{},不是 地图[字符串]接口{}

在您的代码中,您将 item 转换为 map[string]interface{}

for _, urlItem := range item.(map[string]interface{}){
   do some stuff
}

但实际的 item[]interface {} :将你的隐蔽类型更改为这个。

因为你可以看到你的结果数据是:

[map[name:default url:/some/url] map[name:second url:/another/url]]

它是一个array,具有map。不是map

首先您可以将数据转换为[]interface{},然后获取该数据的索引并将其转换为map[string]interface{}。 所以一个例子看起来像这样:

data := item.([]interface{})
for _,value := range data{
  yourMap := value.(map[string]interface{})
  //name value
  name := yourMap["name"].(string) // and so on
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-29
    • 1970-01-01
    • 2013-09-23
    • 1970-01-01
    • 2022-08-14
    • 2015-11-21
    • 1970-01-01
    相关资源
    最近更新 更多