亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

將包含動態鍵的 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 關注
  • 221 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號