Непревзойденный комплекс JSON в Go - PullRequest
0 голосов
/ 28 сентября 2018

Итак, я пытаюсь получить аналитику приложения с помощью команды ping и конечной точки.Я делаю запрос GET, который успешно (без ошибок там), но я не могу декодировать JSON

Мне нужно декодировать следующий JSON в структуры

{
  "noResultSearches": {
    "results": [
      {
        "count": 1,
        "key": "\"note 9\""
      },
      {
        "count": 1,
        "key": "nokia"
      }
    ]
  },
  "popularSearches": {
    "results": [
      {
        "count": 4,
        "key": "6"
      },
      {
        "count": 2,
        "key": "\"note 9\""
      },
      {
        "count": 1,
        "key": "nokia"
      }
    ]
  },
  "searchVolume": {
    "results": [
      {
        "count": 7,
        "key": 1537401600000,
        "key_as_string": "2018/09/20 00:00:00"
      }
    ]
  }
}

Для которого яиспользуя следующие структуры

type analyticsResults struct {
    Count int    `json:"count"`
    Key   string `json:"key"`
}

type analyticsVolumeResults struct {
    Count     int    `json:"count"`
    Key       int64 `json:"key"`
    DateAsStr string `json:"key_as_string"`
}

type analyticsPopularSearches struct {
    Results []analyticsResults `json:"results"`
}

type analyticsNoResultSearches struct {
    Results []analyticsResults `json:"results"`
}

type analyticsSearchVolume struct {
    Results []analyticsVolumeResults `json:"results"`
}

type overviewAnalyticsBody struct {
    NoResultSearches analyticsNoResultSearches `json:"noResultSearches"`
    PopularSearches  analyticsPopularSearches  `json:"popularSearches"`
    SearchVolume     analyticsSearchVolume     `json:"searchVolume"`
}

Я делаю GET-запрос к конечной точке, а затем использую тело ответа для декодирования json, но получаю ошибку.Ниже приведена часть кода, которая остается в моей ShowAnalytics функции

func ShowAppAnalytics(app string) error {
  spinner.StartText("Fetching app analytics")
  defer spinner.Stop()

  fmt.Println()
  req, err := http.NewRequest("GET", "<some-endpoint>", nil)
  if err != nil {
      return err
  }
  resp, err := session.SendRequest(req)
  if err != nil {
      return err
  }
  spinner.Stop()

  var res overviewAnalyticsBody
  dec := json.NewDecoder(resp.Body)
  err = dec.Decode(&res)
  if err != nil {
      return err
  }

  fmt.Println(res)

  return nil
}

json: невозможно распаковать массив в поле обзора структуры Go GoAnalyticsBody.noResultПоиск типа app.analyticsNoResultSearches

Что я здесь не так делаю?Почему я получаю эту ошибку?

1 Ответ

0 голосов
/ 28 сентября 2018

РЕДАКТИРОВАТЬ: После того, как вы отредактировали, ваш текущий код работает как есть.Проверьте это здесь: Go Playground .

Ниже следует оригинальный ответ.


Существует некоторое несоответствие между отправленным вами кодом и полученной ошибкой.

Я попробовал это на игровой площадке Go ( вот ваша версия ), и я получаю следующую ошибку:

json: не могу разархивировать число в AnalyticsVolumeResults поля Gt struct.ключ типа string

Мы получаем эту ошибку, потому что в JSON searchVolume.results.key есть число:

    "key": 1537401600000,

И вы использовали string в модели Go:

Key       string `json:"key"`

Если мы изменим его на int64:

Key       int64 `json:"key"`

Он работает и печатает (попробуйте на Go Playground ):

{{[{1 "note 9"} {1 nokia}]} {[{4 6} {2 "note 9"} {1 nokia}]} {[{7 1537401600000 2018/09/20 00: 00: 00}]}}

Если этот ключ иногда может быть числом, а иногда string, вы также можете использовать json.Number в модели Go:

Key       json.Number `json:"key"`
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...