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
}
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
@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
Ja, testen Sie es. Wenn Sie ein Problem haben, können Sie die Frage aktualisieren oder eine andere Frage stellen. – putu