Unmarshall json响应struct empty

Unmarshall json响应struct empty

问题描述:

我想解开JSON响应,它是空的。我相信这是我在这里失踪的令人难以置信的蠢事!Unmarshall json响应struct empty

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 
} 

我可以通过串(机构)看到JSON正在下降,但没有分配给结构体。我一度绝望,转移到json.decoder以达到相同的结果。有什么想法吗?

你有一个错误的Quotas结构定义,你可以从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/

结构除了定义一个类型@ Зелёный的确如此,你也可以使用匿名结构。这是特别有用,当你只需要一次结构:

var response struct { 
    Quotas []Quota `json:"response"` 
} 

代码:

package main 

import (
    "encoding/json" 
    "fmt" 
    "strings" 
) 

type Quota 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"` 
} 

func main() { 

    const payload = `{ 
    "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 response struct { 
     Quotas []Quota `json:"response"` 
    } 

    json.NewDecoder(strings.NewReader(payload)).Decode(&response) 

    fmt.Printf("%+v\n", response) 
} 

,您可以尝试在这里:https://play.golang.org/p/r2tzDdGlIV