2017-08-08 4 views
-4

Ich versuche, eine JSON-Antwort mit dem folgenden Code zu analysieren:eine JSON-Antwort Parsing Abstellungs mit

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

    errj := json.Unmarshal(data, &token) 
    if errj != nil { 
     fmt.Println("JSON PARSING ERROR") 
    } 
    fmt.Printf("read resp.Body successfully:\n%v\n", string(data)) 
    fmt.Printf("Response Headers \n%v\n", resp.Header) 
    fmt.Println(token.access_token) 


} else { 
    fmt.Println("Request failed !" , resp.StatusCode) 
} 

Ich habe auch versucht

json.NewDecoder(resp.Body).Decode(&token) 

aber ich bin nicht in der Lage zu verwenden, um die Token-Struktur zu erhalten bevölkert und es gibt keine Fehler. Die Antwort, die ich zurück bin immer gut aussieht

resp.Body lesen erfolgreich:

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

Hat jemand irgendwelche Ideen, was ich falsch mache mit beiden Ansätzen?

EDIT - Lösung:

type Token struct { 
    Access_token string `json:access_token` 
    Token_type string `json:token_type` 
    Expires_in int `json:expires_in` 
} 

Abstellungs die exportierten Schlüssel benötigt, die aktiviert werden müssen.

+2

Bitte bearbeiten Sie Ihre Frage, um die Definition des Typs 'Token' einzuschließen. – Adrian

+1

Hier muss irgendwo ein gutes Duplikat sein ... – RayfenWindspear

+1

Beachten Sie, dass Variablennamen mit Unterstrichen nicht "golang" konform sind – TehSphinX

Antwort

3

Sie haben nicht exportierte Felder in Token (Felder beginnen mit einem Kleinbuchstaben). Da die Felder nicht exportiert werden, kann json sie nicht anzeigen und kann daher nicht in ihnen entpacken. Bitte lesen Sie the documentation for json.Unmarshal:

Um Abstellungs JSON in eine Struktur, Streichhölzer Abstellungs eingehendes Objekt Schlüssel, um die Schlüssel von Marschall (entweder der Struktur Feldnamen oder seinem -Tag), eine genaue Übereinstimmung bevorzugen, sondern auch einen Fall zu akzeptieren -insensitive übereinstimmen. Unmarshal setzt nur exportierte Felder der Struktur.

+0

Sie gewinnen diese Zeit;) – RayfenWindspear

+0

Durch fast 30 ganze Sekunden;) – Adrian

+0

@Adrian waren Sie .. Programmierung in zu vielen Sprachen. Vielen Dank ! – avrono