doushouxie7064 2017-08-08 17:01
浏览 218

使用Unmarshal解析JSON响应[重复]

This question already has an answer here:

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

    errj := json.Unmarshal(data, &token)
    if errj != nil {
        fmt.Println("JSON PARSING ERROR")
    }
    fmt.Printf("read resp.Body successfully:
%v
", string(data))
    fmt.Printf("Response Headers 
%v
", 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.

</div>
  • 写回答

1条回答 默认 最新

  • dongying6896 2017-08-08 17:06
    关注

    You have unexported fields in Token (fields starting with a lower-case letter). Because the fields are not exported, json cannot see them, and so cannot unmarshal into them. Please read the documentation for json.Unmarshal:

    To unmarshal JSON into a struct, Unmarshal matches incoming object keys to the keys used by Marshal (either the struct field name or its tag), preferring an exact match but also accepting a case-insensitive match. Unmarshal will only set exported fields of the struct.

    评论

报告相同问题?

悬赏问题

  • ¥15 Vue3 大型图片数据拖动排序
  • ¥15 划分vlan后不通了
  • ¥15 GDI处理通道视频时总是带有白色锯齿
  • ¥20 用雷电模拟器安装百达屋apk一直闪退
  • ¥15 算能科技20240506咨询(拒绝大模型回答)
  • ¥15 自适应 AR 模型 参数估计Matlab程序
  • ¥100 角动量包络面如何用MATLAB绘制
  • ¥15 merge函数占用内存过大
  • ¥15 使用EMD去噪处理RML2016数据集时候的原理
  • ¥15 神经网络预测均方误差很小 但是图像上看着差别太大