2017-02-06 57 views
0

我已經JSON以下JSON數組散列:如何解析JSON哈希的JSON陣列中GOLANG

[ 
    { 
    "name": "XXXX", 
    "address": "XXXX", 
    "keepalive": { 
     "thresholds": { 
     "warning": 30, 
     "critical": 100 
     }, 
     "handlers": [ 
     "XXXXX" 
     ], 
     "refresh": 180 
    }, 
    "subscriptions": [ 
     "XXXX", 
     "XXXX", 
     "XXXX" 
    ], 
    "version": "0.17.1", 
    "timestamp": 1486413490 
    }, 
    {...}, 
    {...}, 
... 
] 

和AM解析陣列作爲以下:

type Client struct { 
    Name string `json:"name"` 
    Address string `json:"address"` 
    PublicDNS string `json:"publicDNS"` 
    keepalive [] string `json:"keepalive"` 
    Subscriptions [] string `json:"subscriptions"` 
    Version string `json:"version"` 
    Timestamp int64 `json:"timestamp"` 
} 

type ClientResponse []Client 


func getClients(body []byte) (*ClientResponse, error) { 
    var s = new(ClientResponse) 
    err := json.Unmarshal(body, &s) 
    if(err != nil){ 
     fmt.Println("whoops:", err) 
    } 
    return s, err 
} 


func main() { 
    res,err := http.Get("http://xxxxx:4567/clients") 
    if err != nil{ 
     panic(err.Error()) 
    } 

    body,err := ioutil.ReadAll(res.Body) 
    if err != nil{ 
     panic(err.Error()) 
    } 
    s, err := getClients([]byte(body)) 
    fmt.Println(s) 
} 

問題:變量s ,包含所有數組。所以我怎麼可以讓所有數組的名稱值?我應該做的循環,並得到我需要的價值?這是最好的方法嗎?

回答

1

你必須循環它們。

names := make([]string, len(*s)) 
for i := range *s { 
    names[i] = (*s)[i].Name 
} 

順便說一下,您的解組結構不正確。 keepalive不會導出,所以它不會被解組,甚至如果它是,它被定義爲字符串的切片,而在JSON的keepalive字段是具有thresholdshandlers的對象,並且refresh字段

+0

不能s範圍(類型* ClientResponse) –

+0

Ahhh,您創建了一個命名的切片類型。但是,應該能夠覆蓋'* s'。順便提一下,指向切片的指針幾乎不會有用,因爲切片本身只是3個字的結構,所以您只能保存2個字的數據以換取額外的間接層。 – Kaedys

+0

好像現在好了,謝謝..這種陣列的最佳方法是什麼?我的意思是你說「指向切片的指針幾乎沒有用」我這樣做是因爲我得到的錯誤:無法將數組解碼爲main類型的Go值.Client –