2017-05-16 264 views
-2

如何可以解析此JSON对象:解析动态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) 
+0

讲究的类型。 '{“3306”:“3306”}是一个字符串吗?编号为'{ “3306”: “3306”}'的一个名为'Values'领域对象?没有。 – hobbs

回答

3

使用此类型:

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

playground example

注:

  • 字段名称很多比赛。我使用字段名称“端口”来匹配JSON文本中使用的名称。
  • 转到类型应该在JSON筑巢的同一水平。一个结构并映射每个计数的一个嵌套级别。第一次尝试没有足够的嵌套,在第二次尝试具有嵌套(与价值观领域的结构)中的一个层次太多。
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) 
     } 
    } 
}