假設您想獲取一組github users並想要打印他們的暱稱(Login
字段api.github.com
)。
鑑於用戶陣列例如:
[{
"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
}]
你需要一個適當的結構來處理:
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"`
}
我建議你使用json-to-go有一個很好的乾淨的結構賦予了JSON。
然後你就可以做到以下幾點:
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)
}
}
}
哪裏UnmarshalUsers
是
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
}
我建議你使用JSON格式(或者[人JSON(https://github.com/ hjson/hjson-去))。但是,您的問題中的對象符號不是有效的JSON。如果你不能改變格式,你需要實現你自己的解析器。 – putu
@putu對不起,糟糕的問題,我沒有一個JSON字符串複製粘貼,所以我匆匆輸入它。它應該是有效的JSON。所以我可以做一些像json.Unmarshall(response.FormValue(「mods」))?我會測試一下。 – Storm
是的,測試一下。如果您遇到任何問題,可以更新問題或發佈其他問題。 – putu