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

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

Stack Overflow用户
提问于 2020-01-16 04:27:58
回答 3查看 22.5K关注 0票数 7

我正在构建一个项目,该项目从用户那里获取一个术语,然后执行谷歌搜索,并返回json格式的标题列表。

我正在使用serpwow API执行google搜索,并尝试解析响应。

然而,我得到的错误是:

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

我已经查看了各种表单,并试图了解映射是如何工作的,但我不确定为什么在这种情况下,我的映射不起作用。有机结果的表格如下所示:

代码语言:javascript
复制
"organic_results": [
    {
      "position": 1,
      "title": "The 10 Best Pizza Places in Dublin - TripAdvisor",
      "link": "https://www.tripadvisor.ie/Restaurants-g186605-c31-Dublin_County_Dublin.html",
      "domain": "www.tripadvisor.ie",
      "displayed_link": "https://www.tripadvisor.ie › ... › County Dublin › Dublin",
      "snippet": "Best Pizza in Dublin, County Dublin: Find TripAdvisor traveller reviews of Dublin Pizza places and search by price, location, and more.",
      "prerender": false,
      "snippet_matched": [
        "Pizza",
        "Pizza"
      ],
      "cached_page_link": "https://webcache.googleusercontent.com/search?q=cache:OS-Ar9hB_ngJ:https://www.tripadvisor.ie/Restaurants-g186605-c31-Dublin_County_Dublin.html+&cd=4&hl=en&ct=clnk&gl=ie",
      "related_page_link": "https://www.google.com/search?q=related:https://www.tripadvisor.ie/Restaurants-g186605-c31-Dublin_County_Dublin.html+pizza&tbo=1&sa=X&ved=2ahUKEwicjYKvvNjmAhVoSBUIHa9MBhcQHzADegQIARAH",
      "block_position": 2
    },

下面是我的代码片段:

代码语言:javascript
复制
package main

import (
    "fmt"
    "strings"
    serpwow "github.com/serpwow/google-search-results-golang"
)

func main() {
    // set API key
    apiKey := "Key_Hidden"

    //read term to search
    fmt.Print("What term would you like to search in google? ")
    var term string
    fmt.Scanln(&term)

    // set up our search parameters
    parameters := map[string]interface{}{
        "q": term,
    }

    // retrieve the search results as JSON
    response, error := serpwow.GetJSON(parameters, apiKey)

    // print the response, or error, if one occurred
    if error != nil {
        fmt.Println(error)
    } else {
    //extract title from organic results
    //result := fmt.Sprintf("%v", response["organic_results"].(map[string]interface{})["title"])
    for _, item := range response["organic_results"].([]interface{}) {
        fmt.Sprintf("%v", item.(map[string]interface{})["title"])
    }
    //s := []string{result, "\n"}
    //fmt.Printf(strings.Join(s, " "))

}

}有人能帮我找出我的逻辑哪里错了吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-01-16 04:31:44

response["organic_results"]对应于JSON数组"organic_results",因此它不是一个map[string]interface{},而是一个[]interface。有多个结果,而不是一个。

代码语言:javascript
复制
for _,item:=range respose["organic_results"].([]interface{}) {
    fmt.Printf("%v", item.(map[string]interface{})["title"])
}
票数 10
EN

Stack Overflow用户

发布于 2020-01-16 04:32:45

正如您在JSON中看到的,organic_results的值是一个JSON数组,而不是一个对象;数组的每个元素都是一个对象。因此,您不能将organic_results断言为map[string]interface{},因为正如错误所述,它不是一个映射,而是一个[]interface。例如,您可以这样做:

代码语言:javascript
复制
    result := fmt.Sprintf("%v", response["organic_results"].([]interface{})[0].(map[string]interface{})["title"])

但当然,这只会得到第一个结果的标题,如果结果为空,它将崩溃。您必须将其视为“从响应中获取标题”,而是“处理零个或多个返回的结果”--也就是说,您可能希望循环遍历organic_results并对每个result对象执行某些操作。

票数 0
EN

Stack Overflow用户

发布于 2020-11-10 19:07:28

有时,逆向工程也能起作用,我也有同样的问题,尽管我定义的所有类型看起来都很直观,但我无法对自定义的JSON文件执行UnMarshall。

代码语言:javascript
复制
type ResourceConfig struct {
    ResourceType map[string]AlphabetType  `json:"resourceType"`
    RedisConfig  RedisConfigT               `json:"redisConfig"`
}

type AlphabetType struct {
    XXX  []string `json:"xxx"`
    YYY []string `json:"yyy"`
}

type RedisConfigT struct {
    Broker string     `json:"broker"`
    DB     string     `json:"db"`
}

它的json看起来像这样:

代码语言:javascript
复制
{
        "resourceType": [
                {"/abcdefg": [{"xxx": ["/vrf", "/lsp", "/vpn"], "yyy": ["/fpc"]}]},
                {"/vrf": [{"xxx": [""], "yyy": ["/abcdefg"]}]},
                {"/lsp": [{"xxx": [""], "yyy": ["/abcdefg"]}]},
                {"/vpn": [{"xxx": [""], "yyy": ["/abcdefg"]}]},
                {"/fpc": [{"xxx": ["/abcdefg"], "yyy": [""]}]}
        ],
        "redisConfig": {"broker": "localhost: 6379", "db": 0}
}

在执行UnMarshall时,它抛出了无法解析的错误。

因此,我决定首先以编程方式形成所需的map,将其编组到一个json中,然后打印它。

代码语言:javascript
复制
{"resourceType":{"/fpc":{"XXX":["/abcdefg"],"YYY":[]},
"/abcdefg":{"XXX":["/vrf","/lsp","/vpn"],"YYY":["/fpc"]},
"/abc":{"XXX":[],"YYY":["/abcdefg"]},
"/vpn":{"XXX":[],"YYY":["/abcdefg"]},
"/vrf":{"XXX":[],"YYY":["/abcdefg"]}},
"redisConfig":{"broker":"localhost:6349","db":"0"}}

现在在中使用相同的格式。json文件并对其执行UnMarshal。它将很好地适应您定义的类型,Json最初就是基于这些类型生成的。

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

https://stackoverflow.com/questions/59759095

复制
相关文章

相似问题

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