2017-08-11 59 views
0

我正在開發一個項目,這是我第一次使用Go。在Go中創建結構以從API中讀取

該項目查詢了大量的API,並在大多數情況下,我沒有得到這個工作的麻煩。

從PHP背景來看,爲我的JSON響應創建Go類型定義有點不同。

我被困在一個API,Magento的API,它返回像這樣的JSON響應:

{ 
    "66937": { 
     "entity_id": "66937", 
     "website_id": "1", 
     "email": "[email protected]", 
     "group_id": "1", 
     "created_at": "2017-08-11 02:09:18", 
     "disable_auto_group_change": "0", 
     "firstname": "Joe", 
     "lastname": "Bloggs", 
     "created_in": "New Zealand Store View" 
    }, 
    "66938": { 
     "entity_id": "66938", 
     "website_id": "1", 
     "email": "[email protected]", 
     "group_id": "1", 
     "created_at": "2017-08-11 02:16:41", 
     "disable_auto_group_change": "0", 
     "firstname": "Jane", 
     "lastname": "Doe", 
     "created_in": "New Zealand Store View" 
    } 
} 

我一直在使用的工具,JSON-to-Go,幫我創造struct類型,但是它不「T看起來很適合這種風格的響應:

type AutoGenerated struct { 
    Num0 struct { 
     EntityID    string `json:"entity_id"` 
     WebsiteID    string `json:"website_id"` 
     Email     string `json:"email"` 
     GroupID    string `json:"group_id"` 
     CreatedAt    string `json:"created_at"` 
     DisableAutoGroupChange string `json:"disable_auto_group_change"` 
     Firstname    string `json:"firstname"` 
     Lastname    string `json:"lastname"` 
     CreatedIn    string `json:"created_in"` 
    } `json:"0"` 
    Num1 struct { 
     EntityID    string `json:"entity_id"` 
     WebsiteID    string `json:"website_id"` 
     Email     string `json:"email"` 
     GroupID    string `json:"group_id"` 
     CreatedAt    string `json:"created_at"` 
     DisableAutoGroupChange string `json:"disable_auto_group_change"` 
     Firstname    string `json:"firstname"` 
     Lastname    string `json:"lastname"` 
     CreatedIn    string `json:"created_in"` 
    } `json:"1"` 
} 

所有我感興趣的是內JSON - 東西實際上與客戶做。我正在循環這個來提取一些信息。

如何創建所需的struct以讀取此?

我看過任何數量的文檔或文章,但他們傾向於使用更簡單的JSON響應作爲示例。

回答

1

對於你的JSON結構,下面可能會適合。

播放鏈接:https://play.golang.org/p/ygXsdYALCb

創建你喜歡還可以自定義你的字段名,只要你喜歡一個struct稱爲Info或名稱。

type Info struct { 
    EntityID    string `json:"entity_id"` 
    WebsiteID    string `json:"website_id"` 
    Email     string `json:"email"` 
    GroupID    string `json:"group_id"` 
    CreatedAt    string `json:"created_at"` 
    DisableAutoGroupChange string `json:"disable_auto_group_change"` 
    Firstname    string `json:"firstname"` 
    Lastname    string `json:"lastname"` 
    CreatedIn    string `json:"created_in"` 
} 

,創造Info結構和數據編它的map

var result map[string]Info 
if err := json.Unmarshal(jsonBytes, &result); err != nil { 
    fmt.Println(err) 
} 
fmt.Printf("%+v", result) 

編輯:

由於要求在評論,添加for例如:

fmt.Println("Accessing unmarshal values:") 
for key, info := range result { 
    fmt.Println("Key:", key) 
    fmt.Printf("Complete Object: %+v\n", info) 
    fmt.Println("Individual value, typical object field access:") 
    fmt.Println("EntityID:", info.EntityID) 
    fmt.Println("Email:", info.Email) 
} 
+0

@詹姆斯加入了答案循環細節。請看一看。 – jeevatkm

2

嗯,首先,我不喜歡自動生成的結構定義那裏。我想改變這種狀況看起來像這樣

type Customer struct { 
    EntityID    string `json:"entity_id"` 
    WebsiteID    string `json:"website_id"` 
    Email     string `json:"email"` 
    GroupID    string `json:"group_id"` 
    CreatedAt    string `json:"created_at"` 
    DisableAutoGroupChange string `json:"disable_auto_group_change"` 
    Firstname    string `json:"firstname"` 
    Lastname    string `json:"lastname"` 
    CreatedIn    string `json:"created_in"` 
} 

您可能希望創建一個包裝類型

type Customers map[string]Customer 

這應該與你的JSON您提供工作。把它放在一起

customers := Customers{} 
err := json.Unmarshal(jsonBytes, &customers) 
0

@Xibz和@jeevatkm都提供了很好的解決方案。但是,在某些情況下,並非所有JSON結構都可以解組到Go結構中。您可能需要定義自己的解碼功能。

您也可以嘗試大猩猩的架構包,如果你要定義特定的數據類型或結構自己的解碼功能。

https://github.com/gorilla/schema