将包含动态键的RESTAPI返回的JSON映射到Golang中的结构
我正在从我的Go程序调用RESTAPI,该程序在请求中获取n个酒店ID,并将其数据作为JSON返回。当我在请求中传递2个ID 1018089108070373346和2017089208070373346时,响应如下所示:将包含动态键的RESTAPI返回的JSON映射到Golang中的结构,json,rest,go,Json,Rest,Go,我正在从我的Go程序调用RESTAPI,该程序在请求中获取n个酒店ID,并将其数据作为JSON返回。当我在请求中传递2个ID 1018089108070373346和2017089208070373346时,响应如下所示: { "data": { "1018089108070373346": { "name": "A Nice Hotel", "success": true }, "2017089208070373346": { "name": "Anot
{
"data": {
"1018089108070373346": {
"name": "A Nice Hotel",
"success": true
},
"2017089208070373346": {
"name": "Another Nice Hotel",
"success": true
}
}
}
因为我是Golang的新手,所以我使用一个JSON Go工具获取上面响应的结构表示。我得到的是:
type Autogenerated struct {
Data struct {
Num1017089108070373346 struct {
Name string `json:"name"`
Success bool `json:"success"`
} `json:"1017089108070373346"`
Num2017089208070373346 struct {
Name string `json:"name"`
Success bool `json:"success"`
} `json:"2017089208070373346"`
} `json:"data"`
}
我不能使用上面的结构,因为每次传递的实际id值和id数可能不同,返回的JSON将有不同的键。如何将这种情况映射到结构
谢谢使用地图:
type Item struct {
Name string `json:"name"`
Success bool `json:"success"`
}
type Response struct {
Data map[string]Item `json:"data"`
}
下面是一些示例代码,它利用了Mellow Marmots的答案,并展示了如何迭代响应中的项 test.json
{
"data": {
"1018089108070373346": {
"name": "A Nice Hotel",
"success": true
},
"2017089208070373346": {
"name": "Another Nice Hotel",
"success": true
}
}
}
测试。开始
package main
import (
"encoding/json"
"fmt"
"os"
)
// Item struct
type Item struct {
Name string `json:"name"`
Success bool `json:"success"`
}
// Response struct
type Response struct {
Data map[string]Item `json:"data"`
}
func main() {
jsonFile, err := os.Open("test.json")
if err != nil {
fmt.Println("Error opening test file\n", err.Error())
return
}
jsonParser := json.NewDecoder(jsonFile)
var filedata Response
if err = jsonParser.Decode(&filedata); err != nil {
fmt.Println("Error while reading test file.\n", err.Error())
return
}
for key, value := range filedata.Data {
fmt.Println(key, value.Name, value.Success)
}
}
哪些产出:
1018089108070373346 A Nice Hotel true
2017089208070373346 Another Nice Hotel true