Ошибка: интерфейс преобразования интерфейса {} - это [] interface {}, а не карта [string] interface {} - PullRequest
0 голосов
/ 15 января 2020

Я создаю проект, который берет термин от пользователя, а затем выполняет поиск в Google и возвращает список заголовков в формате json.

Я использую API Serpwow для выполнения поиска Google и пытаюсь разобрать ответ.

Однако я получаю сообщение об ошибке:

panic: interface conversion: interface {} is []interface {}, not map[string]interface {}.

Я просмотрел различные формы и попытался узнать, как работает отображение, но я не уверен, почему в этом случае мое отображение не работает. Таблица результатов Organi c выглядит следующим образом:

"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
    },

, и вот фрагмент моего кода:

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, " "))

}

} Может кто-нибудь, пожалуйста, помогите мне выяснить, где мои логики c не так?

Ответы [ 2 ]

1 голос
/ 15 января 2020

response["organic_results"] соответствует массиву JSON «Organic_results», следовательно, это не map[string]interface{}, а []interface. Есть несколько результатов, а не один.

for _,item:=range respose["organic_results"].([]interface{}) {
    fmt.Printf("%v", item.(map[string]interface{})["title"])
}
0 голосов
/ 15 января 2020

Как вы можете видеть в JSON, значение organic_results является массивом JSON, а не объектом; каждый элемент массива является объектом. Таким образом, вы не можете утверждать organic_results до map[string]interface{}, потому что, как гласит ошибка, это не карта, это []interface. Вы можете, например, сделать:

    result := fmt.Sprintf("%v", response["organic_results"].([]interface{})[0].(map[string]interface{})["title"])

Но, конечно, это даст вам только заголовок первого результата, и он получит sh, если результаты будут пустыми. Вы должны будете думать об этом не как «получить заголовок из ответа», а как «обрабатывать ноль или более возвращаемых результатов» - т.е. вы, вероятно, захотите сделать l oop более organic_results и что-то сделать с каждым объект результата.

...