如何从Go http.Request中检索对象?

时间:2017-06-03 22:32:59

标签: json http go get httprequest

我有一个可以接收HTTP GET参数的应用程序。到目前为止,它们一直是Strings和ints,并且使用

工作得很好
http.Request.FormValue("field")

但是现在我在参数中添加了一系列简单对象,我不知道如何将其转换为Go结构片段。

有问题的数组是

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

所以我不确定如何继续将它映射到Go结构。我应该首先创建结构并使用JSON映射r.FormValue的结果吗?

2 个答案:

答案 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解组为您创建的结构类型的变量。