json 如何到达嵌套的结构元素

zsbz8rwp  于 2023-03-20  发布在  其他
关注(0)|答案(1)|浏览(141)

我有一个这样的结构体。我想把我的Json解析成这个结构体。但是我不能到达嵌套的结构体。
我希望能访问like的substructs,但我不能:

func main() {
    str := `[{
        "ApplicationDefaults":  {
            "ApplicationPoolName": "DefaultAppPool",
                ....
    }]`

    mdl := foo(str)

    // mdl.ApplicationDefaults ?? I can't reach like this. There are only a few functions like: append!, last! , print!, range!, reverse!, sort!, var!
}

有人帮忙吗?
我的结构:

package model

type SitesDetails []struct {
    ApplicationDefaults struct {
        ApplicationPoolName string      `json:"ApplicationPoolName"`
        EnabledProtocols    string      `json:"EnabledProtocols"`
        Attributes          string      `json:"Attributes"`
        ChildElements       string      `json:"ChildElements"`
        ElementTagName      string      `json:"ElementTagName"`
        IsLocallyStored     bool        `json:"IsLocallyStored"`
        Methods             interface{} `json:"Methods"`
        RawAttributes       string      `json:"RawAttributes"`
        Schema              string      `json:"Schema"`
    } `json:"ApplicationDefaults"`
    Applications []string `json:"Applications"`
    Bindings     []string `json:"Bindings"`
    ID           int      `json:"Id"`
    Limits       struct {
        ConnectionTimeout string      `json:"ConnectionTimeout"`
        MaxBandwidth      int64       `json:"MaxBandwidth"`
        MaxConnections    int64       `json:"MaxConnections"`
        MaxURLSegments    int         `json:"MaxUrlSegments"`
        Attributes        string      `json:"Attributes"`
        ChildElements     string      `json:"ChildElements"`
        ElementTagName    string      `json:"ElementTagName"`
        IsLocallyStored   bool        `json:"IsLocallyStored"`
        Methods           interface{} `json:"Methods"`
        RawAttributes     string      `json:"RawAttributes"`
        Schema            string      `json:"Schema"`
    } `json:"Limits"`
}

这是我用来将json解析为我的结构体的代码:

func foo(resp string) model.SitesDetails {
    data := []byte(resp)

    var m model.SitesDetails
    err := json.Unmarshal(data, &m)
    if err != nil {
        log.Fatal(err)
    }
    return m
}
eqqqjvef

eqqqjvef1#

在这里,您正在解组到一个***片***中(因为您的SitesDetails类型是[]struct,并且您的json以数组开头),因此您应该能够通过访问您的详细信息

poolName := model[0].ApplicationDefaults.ApplicationPoolName

这也解释了为什么您的IDE只建议可以应用于切片的操作,例如appending(我猜这将插入适当的代码以附加到切片)。
顺便说一句,您真的不应该调用变量model,因为这显然也是您的包所使用的名称(您使用的是model.SitesDetails),因此您的变量名会在此时隐藏包-这可能会导致严重的混乱,任何像样的IDE都应该警告您这一点。

相关问题