创建结构以从Go中读取API

时间:2017-08-11 02:49:46

标签: json go struct

我正在开展一个项目,这是我第一次使用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响应作为示例。

3 个答案:

答案 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的模式包。

https://github.com/gorilla/schema