我正在开展一个项目,这是我第一次使用Go。
该项目查询了许多API,而且大多数情况下我都没有遇到这个问题。
来自PHP背景,为我的JSON响应创建Go类型定义有点不同。
我被困在一个API上,一个Magento 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响应作为示例。
答案 0 :(得分:1)
对于您的JSON结构,可能非常适合。
播放链接:https://play.golang.org/p/ygXsdYALCb
创建名为static let dataChangedNotification = Notification.Name("DataChanged")
override func viewWillAppear(_ animated: Bool) {
super.viewWillAppear(animated)
}
override func viewDidLoad() {
super.viewDidLoad()
// Establish a way for call activity to notify this class so it can update accordingly
NotificationCenter.default.addObserver(self, selector: #selector(handleDataChangedNotification(notification:)), name: "DataChanged", object: nil)
}
func handleDataChangedNotification(notification: NSNotification) {
// This ViewController was notified that data was changed
// Do something
}
func getDataToDisplay() {
let currentData = MyData.shared.data
// do something
}
// Any view controller would call this function if it changes the data
func sendDataChangeNotification() {
let obj = [String]() // make some obj to send. Pass whatever custom data you need to send
NotificationCenter.default.post(name: type(of: self).dataChangedNotification, object: obj)
}
的{{1}}或您喜欢的名称,并根据需要自定义字段名称。
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"`
}
并解组它。
map
修改强>
正如评论中所述,添加Info
示例:
var result map[string]Info
if err := json.Unmarshal(jsonBytes, &result); err != nil {
fmt.Println(err)
}
fmt.Printf("%+v", result)
答案 1 :(得分:1)
嗯,首先,我不喜欢那里自动生成的结构定义。我会改变它看起来像这样
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)
答案 2 :(得分:0)
@Xibz和@jeevatkm都提供了很好的解决方案。但是,在某些情况下,并非所有JSON结构都可以解组为Go结构。您可能必须定义自己的解码功能。
如果必须为特定数据类型或结构定义自己的解码函数,也可以尝试使用gorilla的模式包。