2017-05-16 334 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) 
     } 
    } 
}