在Go中解组复杂的json

时间:2018-09-28 12:51:57

标签: json go

因此,我试图通过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结构字段   overviewAnalyticsBody.noResultSearches类型   app.analyticsNoResultSearches

我在这里做错了什么?为什么会出现此错误?

1 个答案:

答案 0 :(得分:1)

编辑:编辑后,当前代码按原样工作。在此处查看:Go Playground

原始答案如下。


您发布的代码与收到的错误之间存在一些不一致之处。

我在Go Playground(here's your version)上尝试过,但出现以下错误:

  

json:无法将数字解组到字符串类型的Go结构字段analyticsVolumeResults.key

我们收到此错误,因为在JSON searchVolume.results.key中是一个数字:

    "key": 1537401600000,

您在Go模型中使用了string

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,那么您也可以在Go模型中使用json.Number

Key       json.Number `json:"key"`