Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将包含动态键的RESTAPI返回的JSON映射到Golang中的结构_Json_Rest_Go - Fatal编程技术网

将包含动态键的RESTAPI返回的JSON映射到Golang中的结构

将包含动态键的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

我正在从我的Go程序调用RESTAPI,该程序在请求中获取n个酒店ID,并将其数据作为JSON返回。当我在请求中传递2个ID 1018089108070373346和2017089208070373346时,响应如下所示:

{
 "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