我有一个可以接收HTTP GET参数的应用程序。到目前为止,它们一直是Strings和ints,并且使用
工作得很好http.Request.FormValue("field")
但是现在我在参数中添加了一系列简单对象,我不知道如何将其转换为Go结构片段。
有问题的数组是
mods:[{
name : x,
max : 1,
min : 2
},{
name:y,...
}]
所以我不确定如何继续将它映射到Go结构。我应该首先创建结构并使用JSON映射r.FormValue的结果吗?
答案 0 :(得分:2)
假设您想要获取一组github users并想要在Login
中打印他们的昵称(api.github.com
字段)。
给定一个User数组示例:
[{
"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
}
答案 1 :(得分:0)
查看encoding/json包。在Go中,你必须编组和解组你的Go结构进出编码。这不是一件容易的事,但对于像Go这样的严格类型的语言来说,它是一个很好的现代解决方案。
在您的情况下,您将要创建一个与您尝试提取的json的结构相匹配的结构,然后将json解组为您创建的结构类型的变量。