[英]Creating struct to read from API in Go
我正在做一个项目,这是我第一次使用Go。
该项目查询了许多API,并且在大多数情况下,我都可以正常工作。
来自PHP背景,为我的JSON响应创建Go类型定义有点不同。
我被困在一个API(Magento API)上,该API会返回JSON响应,如下所示:
{
"66937": {
"entity_id": "66937",
"website_id": "1",
"email": "email@email.com",
"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": "email1@email.comm",
"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
类型,但是这种响应方式看起来并不正确:
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响应作为示例。
对于您的JSON结构,以下可能很适合。
播放链接: https : //play.golang.org/p/ygXsdYALCb
创建一个名为Info
或名称的struct
您也可以根据需要自定义字段名称。
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)
}
好吧,首先,我不喜欢那里自动生成的结构定义。 我会改变它看起来像这样
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)
@Xibz和@jeevatkm都提供了很好的解决方案。 但是,在某些情况下,并非所有JSON结构都可以解组为Go结构。 您可能必须定义自己的解码功能。
如果您必须为特定的数据类型或结构定义自己的解码功能,也可以尝试使用gorilla的架构包。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.