go - 解码 json 响应结构为空

标签 go struct unmarshalling

我正在尝试解码 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, &quota1)
    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}]}

Go Play

<子> 这是给你的提示,在此处将 json 有效负载转换为结构 http://json2struct.mervine.net/

关于go - 解码 json 响应结构为空,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46863502/

相关文章:

go - TLS 身份验证 : What does each cert need to contain?

json - 在golang中编辑继承属性的标签?

c++ - 静态结构链接器错误

c# - 另一个 PInvoke - 错误消息显示未找到源?

java - 解码时出现意外的元素错误

ruby-on-rails - Rspec:如何修复所需的编码格式版本 4.8; 34.92 给出的错误

unicode - 如何在 Go 程序内部存储文本?

go - Golang 的 Codeclimate 测试覆盖格式化程序

c# - 如果我的结构不在 COM Interop 中执行,我应该为我的结构使用 LayoutKind.Auto 吗?

c# - 编码 C 和 C#