英文:
How to reach nested struct elements
问题
我有一个这样的结构体。我想将我的 JSON 解析为这个结构体,但我无法访问嵌套的结构体。
我期望能够像这样访问子结构体,但我不能:
func main() {
str := `[{
"ApplicationDefaults": {
"ApplicationPoolName": "DefaultAppPool",
....
}]`
mdl := foo(str)
// mdl.ApplicationDefaults ?? 我无法像这样访问。只有一些函数可用,如: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
}
英文:
I have struct like this. And I want to parse my Json to this struct. But I can not reach nested structs.
I was expecting to reach sub structs for like, but I can not:
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!
}
Any one help?
My struct:
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"`
}
This is the code that I use for parse json to my struct :
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
}
答案1
得分: 2
你在这里进行了**slice**的解组(因为你的SitesDetails类型是[]struct,而你的JSON以数组开始),所以你应该能够通过以下方式访问你的详细信息:
poolName := model[0].ApplicationDefaults.ApplicationPoolName
这也解释了为什么你的IDE只建议可以应用于切片的操作,比如追加(我猜这会插入适当的代码来追加到你的切片中)。
顺便说一下,你真的不应该将变量命名为model,因为这显然是你用于包的名称(你使用了model.SitesDetails),所以在那一点上,你的变量名会遮蔽包 - 这可能会在后面引起很大的混淆,任何好的IDE都应该警告你这一点。
英文:
You're unmarshalling into a slice here (as your SitesDetails type is a []struct and your json starts with an array), so you should be able to access your details via
poolName := model[0].ApplicationDefaults.ApplicationPoolName
This also explains why your IDE only suggests actions that can be applied to slices, such as appending (which I guess would insert the proper code to append to your slice).
By the way, you really shouldn't call your variable model, as that's the name your apparently using for your package as well (you're using model.SitesDetails), so your variable name would shadow the package at that point - this could cause great confusion down the line and any decent IDE should warn you about that.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。


评论