I am trying to parse a JSON response with the following code:
type Token struct { access_token string `json:access_token` token_type string `json:token_type` expires_in int `json:expires_in` } homeURL := "https:/blah.com/oauth2/token" v := url.Values{} v.Set("client_id", "xxx") v.Set("client_secret", "xxx") v.Set("grant_type", "xxx") s := v.Encode() req, err := http.NewRequest("POST", homeURL, strings.NewReader(s)) if err != nil { fmt.Printf("http.NewRequest() error: %v\n", err) return } req.Header.Add("Content-Type", "application/x-www-form-urlencoded") var client = http.Client{} resp, err := client.Do(req) if err != nil { //error fmt.Printf("http.Do() error: %v\n", err) return } defer resp.Body.Close() if resp.StatusCode == 200 { var token Token data, err := ioutil.ReadAll(resp.Body) if err != nil { fmt.Println("Error parsing JSON\n") } errj := json.Unmarshal(data, &token) if errj != nil { fmt.Println("JSON PARSING ERROR") } fmt.Printf("read resp.Body successfully:\n%v\n", string(data)) fmt.Printf("Response Headers \n%v\n", resp.Header) fmt.Println(token.access_token) } else { fmt.Println("Request failed !" , resp.StatusCode) } I also tried to use
json.NewDecoder(resp.Body).Decode(&token) However I am unable to get the token structure populated and there are no errors. The response I am getting back looks fine
read resp.Body successfully:
{"access_token":"Osq","token_type":"Bearer","expires_in":"1247"} Response Headers map[Content-Length:[384] Connection:[keep-alive] Content-Language:[en-US] Date:[Tue, 08 Aug 2017 16:52:19 GMT] Gi-Coordination-Id:[auto_--YfYqIVya0KiAv_mLLET8g] Server:[Mashery Proxy] X-Powered-By:[ASP.NET ARR/3.0 ASP.NET] Content-Type:[application/json; charset=utf-8] Pragma:[no-cache] Cache-Control:[no-cache,no-cache] Expires:[-1]]
Does anyone have any ideas on what I am doing wrong with either approach ?
EDIT - Solution:
type Token struct { Access_token string `json:access_token` Token_type string `json:token_type` Expires_in int `json:expires_in` } Unmarshal needs the exported keys which need to be capitalised.
Tokentype.golangconform