英文:
Trouble unmarshalling nested json with unknown keys
问题
我遇到了一些问题,无法将下面格式的JSON数据解组成一个结构体。JSON的结构对我来说有点混乱,对于我做的所有愚蠢的解组尝试,我表示抱歉。
{
"message": {
"Server1.example.com": [
{
"application": "Apache",
"host": {
"name": "/^Server-[13456]/"
},
"owner": "User1",
"project": "Web",
"subowner": "User2"
}
],
"Server2.example.com": [
{
"application": "Mysql",
"host": {
"name": "/^Server[23456]/"
},
"owner": "User2",
"project": "DB",
"subowner": "User3"
}
]
},
"response_ms": 659,
"success": true
}
我尝试使用以下结构体进行解组:
type ServerDetails struct {
Message struct {
Hostname struct {
Details struct {
Application string `json:"application"`
} `json:"-"`
} `json:"-"`
} `json:"message"`
}
在生成时,Server[0-9].example.com
字段是未知的,并且会发生变化。而且,在服务器名称之后,有一个没有外部键的字段,这再次让我感到困惑。我尝试了很多组合来理解如何解组,但是失败了。
有什么有效的方法可以将JSON字段解组到结构体中吗?
英文:
I am having trouble unmarshalling a json data of the below format to a struct. The structure of the json looks a bit confusing to me, so apologies for all the dumb things I am doing to unmarshal it.
{
"message": {
"Server1.example.com": [
{
"application": "Apache",
"host": {
"name": "/^Server-[13456]/"
},
"owner": "User1",
"project": "Web",
"subowner": "User2"
}
],
"Server2.example.com": [
{
"application": "Mysql",
"host": {
"name": "/^Server[23456]/"
},
"owner": "User2",
"project": "DB",
"subowner": "User3"
}
]
},
"response_ms": 659,
"success": true
}
I am trying to unmarshal it using the following struct.
type ServerDetails struct {
Message struct{
Hostname struct{
Details struct{
Application string `json:"application"`
}`json:"-"`
}`json:"-"`
}`json:"message"`
}
The fields Server[0-9].example.com
will be unknown at the time of generating, and will change, and there is this field
{
"application": "Apache",
"host": {
"name": "/^Server-[13456]/"
},
just after the server name that doesn't have a key outside, which again looks confusing to me. I tried a good number of combinations to understand how this could be unmarshalled, but I failed.
What is a working approach to get the json fields unmarshal into a struct?
答案1
得分: 3
你可以使用map[string]ServerStruct
来满足你的需求。
你的结构体可以像这样定义:
type YourStruct struct {
Success bool
ResponseMS int
Servers map[string]*ServerStruct
}
type ServerStruct struct {
Application string
Owner string
// 其他字段...
}
通过添加一些额外的JSON标签,你就可以解析你的JSON数据了。
英文:
You could include a map[string]ServerStruct to fullfill your requirements.
your struct could look like this:
type YourStruct struct {
Success bool
ResponseMS int
Servers map[string]*ServerStruct
}
type ServerStruct struct {
Application string
Owner string
[...]
}
With some additional json tags, you will be able to parse your json.
答案2
得分: 0
你的JSON在第二个"]"后面有多余的逗号,不符合规范。一旦你修正了JSON,你可以使用优秀的https://mholt.github.io/json-to-go/来构建以下Go结构体:
type AutoGenerated struct {
Message struct {
Server1ExampleCom []struct {
Application string `json:"application"`
Host struct {
Name string `json:"name"`
} `json:"host"`
Owner string `json:"owner"`
Project string `json:"project"`
Subowner string `json:"subowner"`
} `json:"Server1.example.com"`
Server2ExampleCom []struct {
Application string `json:"application"`
Host struct {
Name string `json:"name"`
} `json:"host"`
Owner string `json:"owner"`
Project string `json:"project"`
Subowner string `json:"subowner"`
} `json:"Server2.example.com"`
} `json:"message"`
ResponseMs int `json:"response_ms"`
Success bool `json:"success"`
}
英文:
You JSON is not valid with superfluous comma after the second ]
Once you correct the JSON, you can use the excellent https://mholt.github.io/json-to-go/ to build the following Go struct
type AutoGenerated struct {
Message struct {
Server1ExampleCom []struct {
Application string `json:"application"`
Host struct {
Name string `json:"name"`
} `json:"host"`
Owner string `json:"owner"`
Project string `json:"project"`
Subowner string `json:"subowner"`
} `json:"Server1.example.com"`
Server2ExampleCom []struct {
Application string `json:"application"`
Host struct {
Name string `json:"name"`
} `json:"host"`
Owner string `json:"owner"`
Project string `json:"project"`
Subowner string `json:"subowner"`
} `json:"Server2.example.com"`
} `json:"message"`
ResponseMs int `json:"response_ms"`
Success bool `json:"success"`
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论