2017-10-21 68 views
0

J'essaie de répondre à unmarshall JSON et c'est à venir vide. Je suis sûr que c'est quelque chose d'incroyablement stupide que je manque ici!Unmarshall json réponse struct vide

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" 
    }] 
} 

Struct:

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

requête HTTP et unmarshall:

{ 
    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 
} 

je peux voir par chaîne (corps) JSON est en baisse, mais rien affecté à la structure. J'étais désespéré à un moment et déplacé à json.decoder au même résultat. Des pensées?

Répondre

3

Vous avez une mauvaise définition de structure Quotas, comme vous pouvez le voir à partir de la charge utile json est un tableau .

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) 

} 

Sortie de la console:

=> {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

est une astuce pour vous ici, convertir la charge utile JSON struct ici http://json2struct.mervine.net/

0

Outre la définition d'un type que @ Зелёный a fait, vous pouvez également utiliser structures anonymes. Ceci est particulièrement utile lorsque vous avez seulement besoin struct fois:

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

Le code:

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

Vous pouvez l'essayer ici: https://play.golang.org/p/r2tzDdGlIV