英文:
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.
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论