猿问

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

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


{

 "data": {

  "1018089108070373346": {

    "name": "A Nice Hotel",

    "success": true

   },

  "2017089208070373346": {

    "name": "Another Nice Hotel",

    "success": true

   }

  }

}

由于我是 Golang 的新手,因此我使用http://mholt.github.io/json-to-go/上提供的 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 将具有不同的键。这种情况如何映射到 struct ?


素胚勾勒不出你
浏览 182回答 2
2回答

婷婷同学_

使用地图:type Item struct {    Name string `json:"name"`    Success bool `json:"success"`} type Response struct {    Data map[string]Item `json:"data"`}

慕尼黑的夜晚无繁华

下面是一些使用 Mellow Marmots 答案的示例代码,并展示了如何迭代响应中的项目。测试文件{ "data": {  "1018089108070373346": {    "name": "A Nice Hotel",    "success": true   },  "2017089208070373346": {    "name": "Another Nice Hotel",    "success": true   }  }}测试去package mainimport (    "encoding/json"    "fmt"    "os")// Item structtype Item struct {    Name    string `json:"name"`    Success bool   `json:"success"`}// Response structtype 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 true2017089208070373346 Another Nice Hotel true
随时随地看视频慕课网APP

相关分类

Go
我要回答