Json 如何从Go http.Request中检索对象?
我有一个可以接收HTTP GET参数的工作应用程序。到目前为止,它们一直是字符串和整数,使用它们可以很好地处理每个字段Json 如何从Go http.Request中检索对象?,json,http,go,get,httprequest,Json,Http,Go,Get,Httprequest,我有一个可以接收HTTP GET参数的工作应用程序。到目前为止,它们一直是字符串和整数,使用它们可以很好地处理每个字段 http.Request.FormValue("field") 但现在我在参数中添加了一个简单对象数组,我不知道如何将其转换为Go结构的一部分 所讨论的数组是 mods:[{ name : x, max : 1, min : 2 },{ name:y,... }] 因此,我不确定如何继续将其映射到Go结构。我是否应该首先创建struct并
http.Request.FormValue("field")
但现在我在参数中添加了一个简单对象数组,我不知道如何将其转换为Go结构的一部分
所讨论的数组是
mods:[{
name : x,
max : 1,
min : 2
},{
name:y,...
}]
因此,我不确定如何继续将其映射到Go结构。我是否应该首先创建struct并使用JSON映射r.FormValue的结果?检查包。在Go中,您必须将Go结构编组和解编组到它们的编码中。这不是一个简单的快速解决方案,但对于像Go这样的严格类型语言来说,这是一个很好的现代解决方案
在您的例子中,您需要创建一个与您试图提取的json结构相匹配的结构,然后将json解组为您创建的结构类型的变量。假设您想要获取一组,并想要打印它们的昵称(
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的情况下使用一个漂亮的干净结构
然后您可以执行以下操作:
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。如果你不能更改格式,你需要实现你自己的解析器。@putu很抱歉这个糟糕的问题,我没有JSON字符串可以复制粘贴,所以我匆忙地把它打印出来。它应该是有效的JSON。那么我能做一些类似json.Unmarshall(response.FormValue(“mods”)的事情吗?我来测试一下。是的,测试一下。如果你遇到任何问题,你可以更新这个问题,或者发布另一个问题。JSON去。。。我所要做的就是节省时间。向上投票!