2017-06-03 79 views
-1

我有一個可以接收HTTP GET參數的工作應用程序。他們一直字符串和整數到現在爲止,它一直很好利用獲得如何從Go http.Request中檢索對象?

http.Request.FormValue("field") 

每個字段但現在我已經在參數添加簡單對象的數組,我不知道如何將它轉換成一小撮Go結構。

有問題的陣列是

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

所以我不知道如何着手將其映射到一個圍棋結構。我應該首先創建結構並使用JSON映射r.FormValue的結果嗎?

+0

我建議你使用JSON格式(或者[人JSON(https://github.com/ hjson/hjson-去))。但是,您的問題中的對象符號不是有效的JSON。如果你不能改變格式,你需要實現你自己的解析器。 – putu

+0

@putu對不起,糟糕的問題,我沒有一個JSON字符串複製粘貼,所以我匆匆輸入它。它應該是有效的JSON。所以我可以做一些像json.Unmarshall(response.FormValue(「mods」))?我會測試一下。 – Storm

+0

是的,測試一下。如果您遇到任何問題,可以更新問題或發佈其他問題。 – putu

回答

2

假設您想獲取一組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 
} 
+1

JSON-to-Go ...我將節省時間。給予好評! – Nate

0

查看encoding/json包。在Go中,你必須編組和解組你的Go結構進出它們的編碼。這不是一件容易的事,但它對於Go等嚴格類型的語言來說是一個很好的現代化解決方案。

對於你的情況,你需要創建一個結構,它匹配你試圖提取的json的結構,然後將json解組成一個你創建的結構類型的變量。