为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
素胚勾勒不出你 2021-12-07 17:08:15
我正在从我的 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 ?
查看完整描述

2 回答

?
婷婷同学_

TA贡献1844条经验 获得超8个赞

使用地图:


type Item struct {

    Name string `json:"name"`

    Success bool `json:"success"`

type Response struct {

    Data map[string]Item `json:"data"`

}


查看完整回答
反对 回复 2021-12-07
?
慕尼黑的夜晚无繁华

TA贡献1864条经验 获得超6个赞

下面是一些使用 Mellow Marmots 答案的示例代码,并展示了如何迭代响应中的项目。


测试文件


{

 "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


查看完整回答
反对 回复 2021-12-07
  • 2 回答
  • 0 关注
  • 181 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信