繁体   English   中英

在Go中创建从API读取的结构

[英]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的架构包。

https://github.com/gorilla/schema

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM