为了账号安全,请及时绑定邮箱和手机立即绑定

处理 JSON API 响应

处理 JSON API 响应

Go
白衣染霜花 2021-10-25 20:18:36
在处理我的第一个 Go 项目时,我在思考一些复杂的数据结构时遇到了一些麻烦。目前,我正在模拟来自 API的响应,该 API 将返回一个包含 2 个属性的 JSON 对象:columns 包含按应处理顺序排列的字段数组data 包含一个对象数组,其中包含列在中的属性 columns我需要迭代data数组/切片,并在其中迭代columns数组/切片并从当前数据对象中提取当前属性。我没有正确处理数据结构。大量的试验和错误让我留下了以下代码和足够的挫败感,决定我只需要提出这个问题。res, err := http.Get("http://roadmap-proto.robwilkerson.org/demo.json")failOnError(err, "Uh oh")defer res.Body.Close()// Decode and process the JSON response// var v map[string]interface{}type View struct {    Columns []string               `"json:columns"`    Data    map[string]interface{} `"json:data"`}v := View{}json.NewDecoder(res.Body).Decode(&v)log.Printf("[====>] Data: %s", v)的输出log.Printf()是这样的:Data: {[id avatar name email phone address] map[]}在columns似乎看还好,而不是数据。最终我需要遍历它并将每个字段写入 Excel 单元格,但到目前为止我什至无法正确“加载”数据。任何朝着正确方向的推动将不胜感激。更新我无意中遗漏了一些关键信息:在对 API 的任何给定调用中,列的数量和名称可能不同。在给定的调用中,data数组中的所有对象都相同,但每次调用都可能非常非常不同。我无法定义静态struct并进行这项工作。
查看完整描述

1 回答

?
郎朗坤

TA贡献1921条经验 获得超9个赞

我会为此使用两个结构:


type ColData struct {

    Id      string `json:"id"`

    Avatar  string `json:"avatar"`

    Name    string `json:"name"`

    Email   string `json:"email"`

    Phone   string `json:"phone"`

    Address string `json:"address"`

}


type View struct {

    Columns []string  `json:"columns"`

    Data    []ColData `json:"data"`

}

回应您的更新:


type View struct {

    Columns []string               `"json:columns"`

    Data    map[string]interface{} `"json:data"`

}

只需要成为


type View struct {

    Columns []string               `"json:columns"`

    Data    []map[string]interface{} `"json:data"`

}

将您的数据放入结构中。与他们一起工作string或json.RawMessage代替他们工作也可能很好interface{},但我真的不知道你在用它做什么/你可能会得到什么。


查看完整回答
反对 回复 2021-10-25
  • 1 回答
  • 0 关注
  • 216 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信