解析动态json对象

时间:2017-05-16 21:29:45

标签: json go

如何解析这个json对象:

{
    "ports": {
        "0": {
            "3306": "3306"
        },
        "1": {
            "3307": "9908"
        }
    }
}

我可以有N个端口,每个端口的值总是一个键:值对。

到目前为止,我已经尝试过这个:

type Ports struct {
    Port map[string]string
}

有了这个,我得到了键(0,1),但值是空的。

我也试过这个:

type Ports struct {
    Port map[string]struct{
        Values map[string]string
    }
}

但也没有工作。

这就是我解码json对象的方式:

var requestBody Ports
decoder := json.NewDecoder(body)
err := decoder.Decode(&requestBody)

2 个答案:

答案 0 :(得分:3)

使用此类型:

type Ports struct {
    Ports map[string]map[string]string
}

playground example

注意:

  • 字段名称匹配很多。我使用字段名称“Ports”来匹配JSON文本中使用的名称。
  • Go类型应该在JSON中具有相同的嵌套级别。一个结构和映射每个计数一个嵌套级别。第一次尝试没有足够的嵌套,第二次尝试有一个太多的嵌套级别(带有值字段的结构)。

答案 1 :(得分: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
    }

    // 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)
        }
    }
}