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

动态 JSON 结构,API 结果 golang

动态 JSON 结构,API 结果 golang

Go
倚天杖 2023-03-21 15:36:00
我必须在 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 内容创建结构和其他必需品。
查看完整描述

1 回答

?
ibeautiful

TA贡献1993条经验 获得超5个赞

{

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


import (

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

    }


}



查看完整回答
反对 回复 2023-03-21
  • 1 回答
  • 0 关注
  • 87 浏览
慕课专栏
更多

添加回答

举报

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