动态 JSON 结构,API 结果 golang

我必须在 GoLang 中进行两次 HTTP API 调用,第一个 API 调用返回此 json 响应:


{

  "status": 200,

  "msg": "OK",

  "result": {

    "id": "24",

    "folderid": "4248"

  }

}

我的第一个响应的 json 结构是这样设置的:


type One struct {

    Status int    `json:"status"`

    Msg    string `json:"msg"`

    Result struct {

        ID       string `json:"id"`

        Folderid string `json:"folderid"`

    } `json:"result"`

}

第二个电话就是问题所在。如您所见,第一个 API 调用返回一个结果 -> id。此 ID 应该是我的第二个结构的开头名称,但我似乎无法使其动态化或将结果作为我的结构名称。此 ID (24) 将始终根据第一个 API 调用而更改。我目前无法解析第二个调用的 JSON 并设置我的结构。在第二次 API 调用中,我想访问 remoteurl/status。


第二次调用结果(我无法解析):


{

  "status": 200,

  "msg": "OK",

  "result": {

    24: ** THIS IS DYNAMIC** {

      "id": 24,

      "remoteurl": "http://proof.ovh.net/files/100Mio.dat",

      "status": "new",

      "bytes_loaded": null,

      "bytes_total": null,

      "folderid": "4248",

      "added": "2015-02-21 09:20:26",

      "last_update": "2015-02-21 09:20:26",

      "extid": false,

      "url": false

    }

  }

}

有谁知道如何设置我的结构或如何解决这个问题。我是一名新程序员,已经为此工作了 4 天。并决定寻求帮助,因为我在学校并且有正常的家庭作业。


发现使用JSON-to-GO有助于解决未来的问题,将基于 JSON 内容创建结构和其他必需品。


倚天杖
浏览 95回答 1
1回答

ibeautiful

{  "status": 200,  "msg": "OK",  "result": {    24:  {      "id": 24,      "remoteurl": "http://proof.ovh.net/files/100Mio.dat",      "status": "new",      "bytes_loaded": null,      "bytes_total": null,      "folderid": "4248",      "added": "2015-02-21 09:20:26",      "last_update": "2015-02-21 09:20:26",      "extid": false,      "url": false    }  }}不是值 JSON。你必须指的是我在下面发布的 JSON,如果你想检查自己,请将你的 JSON 版本复制到任何 JSON 验证器中;https://jsonlint.com/https://jsoneditoronline.org/https://jsonformatter.curiousconcept.com/另请查看下面链接的线程。如果 API 确实返回了您声称返回的内容,则该 API 中存在错误为什么 JSON 只允许字符串作为键?{  "status": 200,  "msg": "OK",  "result": {    "24":  {      "id": 24,      "remoteurl": "http://proof.ovh.net/files/100Mio.dat",      "status": "new",      "bytes_loaded": null,      "bytes_total": null,      "folderid": "4248",      "added": "2015-02-21 09:20:26",      "last_update": "2015-02-21 09:20:26",      "extid": false,      "url": false    }  }}下面是一些使用映射到结构的示例代码,它解决了第二个响应的动态响应package mainimport (    "encoding/json"    "fmt"    "log")var res1 = `{  "status": 200,  "msg": "OK",  "result": {    "id": "24",    "folderid": "4248"  }}`var res2 = `{  "status": 200,  "msg": "OK",  "result": {    "24":  {      "id": 24,      "remoteurl": "http://proof.ovh.net/files/100Mio.dat",      "status": "new",      "bytes_loaded": null,      "bytes_total": null,      "folderid": "4248",      "added": "2015-02-21 09:20:26",      "last_update": "2015-02-21 09:20:26",      "extid": false,      "url": false    }  }}`type One struct {    Status int    `json:"status"`    Msg    string `json:"msg"`    Result struct {        ID       string `json:"id"`        Folderid string `json:"folderid"`    } `json:"result"`}type Two struct {    Status int                  `json:"status"`    Msg    string               `json:"msg"`    Result map[string]innerData `json:"result"`}type innerData struct {    ID          int         `json:"id"`    Remoteurl   string      `json:"remoteurl"`    Status      string      `json:"status"`    BytesLoaded interface{} `json:"bytes_loaded"`    BytesTotal  interface{} `json:"bytes_total"`    Folderid    string      `json:"folderid"`    Added       string      `json:"added"`    LastUpdate  string      `json:"last_update"`    Extid       bool        `json:"extid"`    URL         bool        `json:"url"`}func main() {    var one One    err := json.Unmarshal([]byte(res1), &one)    if err != nil {        log.Fatal(err)    }    var two Two    err = json.Unmarshal([]byte(res2), &two)    if err != nil {        log.Fatal(err)    }    //pretty print both strutures    b, _ := json.MarshalIndent(one, "", " ")    fmt.Printf("%s \n\n", b)    b, _ = json.MarshalIndent(two, "", " ")    fmt.Printf("%s \n\n", b)    // access data from two with id from one    if dat, ok := two.Result[one.Result.ID]; ok {        b, _ = json.MarshalIndent(dat, "", " ")        fmt.Printf("inner data\n%s\n", b)    }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go