我正在尝试解码 JSON 响应,但结果是空的。我确定我在这里缺少的东西非常愚蠢!
JSON:
{
"response": [{
"remain_quota_hour": 500,
"remain_quota_month": 10000,
"assigned_quota_hour": 500,
"assigned_quota_month": 10000,
"hourly_quota_next_reset": "1508464800",
"monthly_quota_next_reset": "1509494400",
"quota_id": "H973AA8",
"cloud_monthly_quota_period_start": "1506816000",
"cloud_monthly_quota_usage_for_this_gw": 0,
"cloud_hourly_quota_usage_for_this_gw": 0,
"cloud_monthly_quota_usage_for_quota_id": 0,
"cloud_hourly_quota_usage_for_quota_id": 0,
"monthly_exceeded_quota": 0,
"hourly_exceeded_quota": 0,
"cloud_quota_max_allow_to_exceed_percentage": 1000,
"pod_time_gmt": "1508461217",
"quota_expiration": "1510358400",
"action": "ALLOW"
}]
}
结构:
type Quotas struct {
Remain_quota_hour int `json:"remain_quota_hour"`
Remain_quota_month int `json:"remain_quota_month"`
Assigned_quota_hour int `json:"assigned_quota_hour"`
Assigned_quota_month int `json:"assigned_quota_month"`
Hourly_quota_next_reset string `json:"hourly_quota_next_reset"`
Monthly_quota_next_reset string `json:"monthly_quota_next_reset"`
Quota_id string `json:"quota_id"`
Cloud_monthly_quota_period_start string `json:"cloud_monthly_quota_period_start"`
Cloud_monthly_quota_usage_for_this_gw int `json:"cloud_monthly_quota_usage_for_this_gw"`
Cloud_hourly_quota_usage_for_this_gw int `json:"cloud_hourly_quota_usage_for_this_gw"`
Cloud_monthly_quota_usage_for_quota_id int `json:"cloud_monthly_quota_usage_for_quota_id"`
Cloud_hourly_quota_usage_for_quota_id int `json:"cloud_hourly_quota_usage_for_quota_id"`
Monthly_exceeded_quota int `json:"monthly_exceeded_quota"`
Hourly_exceeded_quota int `json:"hourly_exceeded_quota"`
Cloud_quota_max_allow_to_exceed_percentage int `json:"cloud_quota_max_allow_to_exceed_percentage"`
Pod_time_gmt string `json:"pod_time_gmt"`
Quota_expiration string `json:"quota_expiration"`
Action string `json:"action"`
}
HTTP 请求和解码:
{
httpClient := http.Client{Timeout: time.Second * 20}
service = service + "quota"
req, err := http.NewRequest(http.MethodGet, service, nil)
if err != nil {
log.Fatal(err)
}
req.Header.Set("Authorization", token)
res, getErr := httpClient.Do(req)
if getErr != nil {
log.Fatal(getErr)
}
log.Println("Header")
body, readErr := ioutil.ReadAll(res.Body)
if readErr != nil {
log.Fatal(readErr)
}
var quota1 Quotas
jsonErr := json.Unmarshal(body, "a1)
if jsonErr != nil {
log.Fatal(jsonErr)
}
log.Println(quota1.Action)
return quota1.Action
}
我可以通过 string(body) 看到 JSON 正在下降,但没有分配给结构。有一次我很绝望,搬到 json.decoder 得到了同样的结果。有什么想法吗?
最佳答案
您有一个错误的配额结构定义,正如您从 json 负载中看到的那样是一个数组。
package main
import (
"encoding/json"
"fmt"
"strings"
)
type Response struct {
Quotas []struct {
Remain_quota_hour int `json:"remain_quota_hour"`
Remain_quota_month int `json:"remain_quota_month"`
Assigned_quota_hour int `json:"assigned_quota_hour"`
Assigned_quota_month int `json:"assigned_quota_month"`
Hourly_quota_next_reset string `json:"hourly_quota_next_reset"`
Monthly_quota_next_reset string `json:"monthly_quota_next_reset"`
Quota_id string `json:"quota_id"`
Cloud_monthly_quota_period_start string `json:"cloud_monthly_quota_period_start"`
Cloud_monthly_quota_usage_for_this_gw int `json:"cloud_monthly_quota_usage_for_this_gw"`
Cloud_hourly_quota_usage_for_this_gw int `json:"cloud_hourly_quota_usage_for_this_gw"`
Cloud_monthly_quota_usage_for_quota_id int `json:"cloud_monthly_quota_usage_for_quota_id"`
Cloud_hourly_quota_usage_for_quota_id int `json:"cloud_hourly_quota_usage_for_quota_id"`
Monthly_exceeded_quota int `json:"monthly_exceeded_quota"`
Hourly_exceeded_quota int `json:"hourly_exceeded_quota"`
Cloud_quota_max_allow_to_exceed_percentage int `json:"cloud_quota_max_allow_to_exceed_percentage"`
Pod_time_gmt string `json:"pod_time_gmt"`
Quota_expiration string `json:"quota_expiration"`
Action string `json:"action"`
} `json:"response"`
}
func main() {
const jsonPayload = `{
"response": [{
"remain_quota_hour": 500,
"remain_quota_month": 10000,
"assigned_quota_hour": 500,
"assigned_quota_month": 10000,
"hourly_quota_next_reset": "1508464800",
"monthly_quota_next_reset": "1509494400",
"quota_id": "H973AA8",
"cloud_monthly_quota_period_start": "1506816000",
"cloud_monthly_quota_usage_for_this_gw": 0,
"cloud_hourly_quota_usage_for_this_gw": 0,
"cloud_monthly_quota_usage_for_quota_id": 0,
"cloud_hourly_quota_usage_for_quota_id": 0,
"monthly_exceeded_quota": 0,
"hourly_exceeded_quota": 0,
"cloud_quota_max_allow_to_exceed_percentage": 1000,
"pod_time_gmt": "1508461217",
"quota_expiration": "1510358400",
"action": "ALLOW"
}]
}`
var data Response
json.NewDecoder(strings.NewReader(jsonPayload)).Decode(&data)
fmt.Printf("%+v\n", data)
}
控制台输出:
=> {Quotas:[{Remain_quota_hour:500 Remain_quota_month:10000 Assigned_quota_hour:500 Assigned_quota_month:10000 Hourly_quota_next_reset:1508464800 Monthly_quota_next_reset:1509494400 Quota_id:H973AA8 Cloud_monthly_quota_period_start:1506816000 Cloud_monthly_quota_usage_for_this_gw:0 Cloud_hourly_quota_usage_for_this_gw:0 Cloud_monthly_quota_usage_for_quota_id:0 Cloud_hourly_quota_usage_for_quota_id:0 Monthly_exceeded_quota:0 Hourly_exceeded_quota:0 Cloud_quota_max_allow_to_exceed_percentage:1000 Pod_time_gmt:1508461217 Quota_expiration:1510358400 Action:ALLOW}]}
<子> 这是给你的提示,在此处将 json 有效负载转换为结构 http://json2struct.mervine.net/
关于go - 解码 json 响应结构为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863502/