Go 处理JSON API响应
在我的第一个Go项目中,我在思考一些复杂的数据结构时遇到了一些困难。目前,我来自一个API,该API将返回一个包含2个属性的JSON对象:Go 处理JSON API响应,go,Go,在我的第一个Go项目中,我在思考一些复杂的数据结构时遇到了一些困难。目前,我来自一个API,该API将返回一个包含2个属性的JSON对象: 列按字段处理顺序包含字段数组 数据包含一个对象数组,其中包含列中列出的属性 我需要迭代数据数组/切片,并在其中迭代列数组/切片,并从当前数据对象提取当前属性。我没有正确处理数据结构。大量的尝试和错误给我留下了以下代码和足够的挫折感,让我决定只需要问这个问题 res, err := http.Get("http://roadmap-proto.robwil
按字段处理顺序包含字段数组列
包含一个对象数组,其中包含数据
列中列出的属性
数据
数组/切片,并在其中迭代列
数组/切片,并从当前数据对象提取当前属性。我没有正确处理数据结构。大量的尝试和错误给我留下了以下代码和足够的挫折感,让我决定只需要问这个问题
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[]}
列
的读数似乎正常,但数据却不正常。最终,我需要循环并将每个字段写入Excel单元格,但到目前为止,我甚至无法正确地“加载”数据
任何朝着正确方向的努力都将不胜感激
更新
我无意中遗漏了一些关键信息:在对API的任何给定调用中,列的数量和名称可能不同。在一个给定的调用中,
data
数组中的所有对象都是相同的,但是每个调用可能非常非常不同。我不能定义一个静态的结构并让它工作。为此我将使用两个结构:
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
而不是接口{}
来使用,但我真的不知道你在用它做什么/你可能得到什么。我会使用两种结构:
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{}
来使用,但是我不知道你在用它做什么/你可能会得到什么。哦,首先,如果不是data-map[string]interface{}“json:data”,你会得到你的数据`
你做了Data[]map[string]接口{}`“json:Data”`
,你实际上有一片映射,而不仅仅是一个映射一种使用[]map[string]string
的方法(所有的对象值都是字符串吗?)就像@user3591723建议的那样:哦,首先,如果不是数据映射[string]接口,你会把数据拿出来{}`“json:data”`
你做了data[]map[string]接口{}`“json:data”`
,你实际上在那里有一片地图,而不仅仅是地图一种使用[]map[string]string
的方法(所有的对象值都是字符串吗?)比如@user3591723建议:如果你的数据是动态的,就使用地图如果你的数据是动态的,就使用地图