英文:
Parse dynamic json object
问题
我可以帮你解析这个 JSON 对象。你可以尝试以下方法:
首先,你可以使用以下结构体定义来解析 JSON:
type Ports struct {
Port map[string]map[string]string `json:"ports"`
}
然后,你可以使用以下代码来解码 JSON 对象:
var requestBody Ports
decoder := json.NewDecoder(body)
err := decoder.Decode(&requestBody)
这样,你就可以通过 requestBody.Port
来访问端口和对应的值了。
希望这对你有帮助!如果你还有其他问题,请随时提问。
英文:
How can I parse this json object:
{
"ports": {
"0": {
"3306": "3306"
},
"1": {
"3307": "9908"
}
}
}
I can have N ports, and the values for each port will always be a key:value pair.
So far I've tried this:
type Ports struct {
Port map[string]string
}
With this I get the keys (0, 1) but the values are empty.
I also tried this:
type Ports struct {
Port map[string]struct{
Values map[string]string
}
}
But also not working.
This is how I am decoding the json object:
var requestBody Ports
decoder := json.NewDecoder(body)
err := decoder.Decode(&requestBody)
答案1
得分: 3
使用以下类型:
type Ports struct {
Ports map[string]map[string]string
}
注意:
- 字段名称必须匹配。我使用字段名"Ports"来匹配JSON文本中使用的名称。
- Go类型在JSON中应具有相同的嵌套级别。结构体和映射各自计为一级嵌套。第一次尝试没有足够的嵌套,第二次尝试有一个多余的嵌套级别(带有Values字段的结构体)。
英文:
Use this type:
type Ports struct {
Ports map[string]map[string]string
}
Notes:
- The field names much match. I used field name "Ports" to match the name used in the JSON text.
- The Go types should have the same level of nesting in the JSON. A struct and map each count for one level of nesting. The first attempt does not have enough nesting, the second attempt has one too many levels of nesting (the struct with Values field).
答案2
得分: 1
你可以像这样解析它。
https://play.golang.org/p/09VDJidAVs
type Ports struct {
Ports map[string]*Port `json:"ports"`
}
type Port map[string]string
func main() {
p := &Ports{}
err := json.Unmarshal([]byte(ports), p)
if err != nil {
fmt.Println(err)
return
}
// 使用
// 如果你需要按照数字值排序,将键获取到一个切片中
keys := make([]string, 0, len(p.Ports))
for k, _ := range p.Ports {
keys = append(keys, k)
}
// 在这里进行排序
for i := range keys {
fmt.Printf("%+v\n", p.Ports[keys[i]])
}
// 如果你不关心排序
for _, v := range p.Ports {
for k, v := range *v {
fmt.Printf("%s: %s\n", k, v)
}
}
}
英文:
You can parse it like this.
https://play.golang.org/p/09VDJidAVs
type Ports struct {
Ports map[string]*Port `json:"ports"`
}
type Port map[string]string
func main() {
p := &Ports{}
err := json.Unmarshal([]byte(ports),p)
if err != nil {
fmt.Println(err)
return
}
// using
// if you need to sort by the number value, get the keys in a slice
keys := make([]string, 0, len(p.Ports))
for k, _ := range p.Ports {
keys = append(keys, k)
}
// sort here
for i := range keys {
fmt.Printf("%+v\n",p.Ports[keys[i]])
}
// if you don't care to sort
for _, v := range p.Ports {
for k, v := range *v {
fmt.Printf("%s: %s\n", k,v)
}
}
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论