2017-06-03 5 views
-1

Ich habe eine funktionierende App, die HTTP-GET-Parameter erhält. Sie haben bis jetzt Strings und Ints gewesen und es hat geklappt hat jedes FeldSo rufen Sie ein Objekt von Go http.Request ab?

http.Request.FormValue("field") 

mit immer Aber jetzt habe ich eine Reihe von einfachen Objekten in den Parametern hinzugefügt, und ich weiß nicht, wie es zu transformieren, um ein Stück Go-Strukturen.

Das Array in Frage

mods:[{ 
    name : x, 
    max : 1, 
    min : 2 
},{ 
    name:y,... 
}] 

Also ich bin nicht sicher, wie es zu einem Go-Struktur abzubilden, um fortzufahren. Soll ich die Struktur zuerst erstellen und das Ergebnis von r.FormValue mit JSON abbilden?

+0

Ich schlage vor, Sie JSON-Format zu verwenden (oder vielleicht [menschlichen JSON] (https://github.com/ hjson/hjson-go)). Die Objektnotation in Ihrer Frage ist jedoch kein gültiger JSON. Wenn Sie das Format nicht ändern können, müssen Sie einen eigenen Parser implementieren. – putu

+0

@putu Sorry für die lausige Frage, ich hatte keine JSON-Zeichenfolge zum Kopieren-Einfügen, also tippte ich es hastig aus. Es sollte gültiger JSON sein. Also kann ich einfach sowas wie json.Unmarshall (response.FormValue ("mods")) machen? Ich werde es ausprobieren. – Storm

+0

Ja, testen Sie es. Wenn Sie ein Problem haben, können Sie die Frage aktualisieren oder eine andere Frage stellen. – putu

Antwort

2

Nehmen wir an, Sie möchten einen Satz von github users abrufen und möchten ihre Spitznamen (Login Feld in api.github.com) drucken.

ein User-Array Beispiel Gegeben:

[{ 
    "login": "simonjefford", 
    "id": 136, 
    "avatar_url": "https://avatars1.githubusercontent.com/u/136?v=3", 
    "gravatar_id": "", 
    "url": "https://api.github.com/users/simonjefford", 
    "html_url": "https://github.com/simonjefford", 
    "followers_url": "https://api.github.com/users/simonjefford/followers", 
    "following_url": "https://api.github.com/users/simonjefford/following{/other_user}", 
    "gists_url": "https://api.github.com/users/simonjefford/gists{/gist_id}", 
    "starred_url": "https://api.github.com/users/simonjefford/starred{/owner}{/repo}", 
    "subscriptions_url": "https://api.github.com/users/simonjefford/subscriptions", 
    "organizations_url": "https://api.github.com/users/simonjefford/orgs", 
    "repos_url": "https://api.github.com/users/simonjefford/repos", 
    "events_url": "https://api.github.com/users/simonjefford/events{/privacy}", 
    "received_events_url": "https://api.github.com/users/simonjefford/received_events", 
    "type": "User", 
    "site_admin": false 
}] 

Sie benötigen eine richtige Struktur, es zu handhaben:

type Users []struct { 
    Login string `json:"login"` 
    ID int `json:"id"` 
    AvatarURL string `json:"avatar_url"` 
    GravatarID string `json:"gravatar_id"` 
    URL string `json:"url"` 
    HTMLURL string `json:"html_url"` 
    FollowersURL string `json:"followers_url"` 
    FollowingURL string `json:"following_url"` 
    GistsURL string `json:"gists_url"` 
    StarredURL string `json:"starred_url"` 
    SubscriptionsURL string `json:"subscriptions_url"` 
    OrganizationsURL string `json:"organizations_url"` 
    ReposURL string `json:"repos_url"` 
    EventsURL string `json:"events_url"` 
    ReceivedEventsURL string `json:"received_events_url"` 
    Type string `json:"type"` 
    SiteAdmin bool `json:"site_admin"` 
} 

Ich schlage vor, Sie json-to-go zu verwenden eine schöne eine saubere Struktur gegeben eine json zu haben.

Dann können Sie wie folgt vorgehen:

package main 

import (
    "fmt" 
    "encoding/json" 
    "net/http" 
    "log" 
    "io/ioutil" 
) 

func main() { 

    response, err := http.Get("https://api.github.com/users?since=135") 
    if err != nil { 
    log.Fatal(err) 
    } else { 

    defer response.Body.Close() 
    users := UnmarshalUsers(response) 
    for _, u := range users { 
     //Print each user's Login nickname 
     fmt.Println(u.Login) 
    } 

    } 

} 

Wo UnmarshalUsers ist

func UnmarshalUsers(r *http.Response) Users { 
    body, err := ioutil.ReadAll(r.Body) 
    if err != nil { 
     panic(err) 
    } 
    var users Users 
    err = json.Unmarshal(body, &users) 
    if err != nil { 
     panic(err) 
    } 

    return users 
} 
+1

JSON-to-Go ... was ich diesmal sparen werde. Upvote! – Nate

0

Überprüfen Sie das encoding/json Paket. In Go musst du deine Go-Strukturen in ihre Codierung einordnen und aus ihrer Codierung entfernen. Es ist nicht schnell und einfach, aber es ist eine gute moderne Lösung für eine streng typisierte Sprache wie Go.

In diesem Fall sollten Sie eine Struktur erstellen, die der Struktur des zu extrahierenden JSON entspricht, und dann den JSON in eine Variable des von Ihnen erstellten Strukturtyps entpacken.

Verwandte Themen