Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/kubernetes/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Json 如何从Go http.Request中检索对象?_Json_Http_Go_Get_Httprequest - Fatal编程技术网

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

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 GET参数的工作应用程序。到目前为止,它们一直是字符串和整数,使用它们可以很好地处理每个字段

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去。。。我所要做的就是节省时间。向上投票!