Go 处理JSON API响应

Go 处理JSON API响应,go,Go,在我的第一个Go项目中,我在思考一些复杂的数据结构时遇到了一些困难。目前,我来自一个API,该API将返回一个包含2个属性的JSON对象: 列按字段处理顺序包含字段数组 数据包含一个对象数组,其中包含列中列出的属性 我需要迭代数据数组/切片,并在其中迭代列数组/切片,并从当前数据对象提取当前属性。我没有正确处理数据结构。大量的尝试和错误给我留下了以下代码和足够的挫折感,让我决定只需要问这个问题 res, err := http.Get("http://roadmap-proto.robwil

在我的第一个Go项目中,我在思考一些复杂的数据结构时遇到了一些困难。目前,我来自一个API,该API将返回一个包含2个属性的JSON对象:

  • 按字段处理顺序包含字段数组
  • 数据
    包含一个对象数组,其中包含
    列中列出的属性
我需要迭代
数据
数组/切片,并在其中迭代
数组/切片,并从当前数据对象提取当前属性。我没有正确处理数据结构。大量的尝试和错误给我留下了以下代码和足够的挫折感,让我决定只需要问这个问题

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建议:如果你的数据是动态的,就使用地图如果你的数据是动态的,就使用地图