2017-02-06 23 views
-1

下面是一個類似的例子:Parsing JSON in GoLang into struct 我從服務器獲取json響應,我只需要獲取某些數據。 我創建了一個示例代碼:如何解析golang中的結構並打印結構中的項目?

package main 

import (
    "fmt" 
    "encoding/json" 
) 

type response struct { 
    Response []struct { 
     Stats struct { 
      A int `json:"a"` 
      B float64 `json:"b"` 
      C int `json:"c"` 
      D float64 `json:"d"` 
      E float64 `json:"e"` 
      F float64 `json:"f"` 
      G float64 `json:"g"` 
      H float64 `json:"h"` 
      I float64 `json:"i"` 
      J float64 `json:"j"` 
     } `json:"stats"` 
     Data []struct { 
      Num0 int64 `json:"0"` 
      Num1 interface{} `json:"1"` 
     } `json:"data"` 
    } `json:"response"` 
} 


func main() { 
    src := ` 
{ 
    "response": [{ 
      "stats": { 
       "a": 458, 
       "b": 302.3738, 
       "c": 0, 
       "d": 706.777, 
       "e": 2.423, 
       "f": 238.73375, 
       "g": 68.971, 
       "h": 85.1989781659389, 
       "i": 84.6381777592766, 
       "j": 292658.49 
      }, 
      "data": [ 
       [1453222860000, null], 
       [1453223160000, 3.769], 
       [1453223220000, 37.464] 
      ] 
     } 
    ] 
} 
` 

    var g response 
    json.Unmarshal([]byte(src), &g) 
    fmt.Println(g.Response[0].Stats) 
} 

我得到的輸出是

`{458 302.3738 0 706.777 2.423 238.73375 68.971 85.1989781659389 84.6381777592766 292658.49} 

`

我想從剛剛統計結構的某些項目。假設我想從stats結構體打印出A或J的值。我怎麼做? 我真的不需要數據結構。我從服務器得到的json響應給了我這些數據,但我並不需要它。無論如何,我的問題是我如何只得到Stats結構中的某些項目?

任何有關如何做到這一點,甚至改善我的結構格式的建議? 謝謝!

+0

難道你不需要在當前打印結束時添加一個'.A'來獲得'A'字段嗎? – squiguy

+0

我試過這樣做,但由於某種原因沒有起作用。無論如何,感謝您的幫助。下面的評論已經解決了我的問題。 – shishh03

回答

1

您可以簡單地省略任何您不關心的結構。 JSON包將靜靜地忽略目標結構中不存在的源JSON中存在的任何內容。因此,如果您不關心數據部分,請從結構中省略它。如果您只關心統計信息部分中的A和J,則只包含這些信息。

type response struct { 
    Response []struct { 
     Stats struct { 
      A int `json:"a"` 
      J float64 `json:"j"` 
     } `json:"stats"` 
    } `json:"response"` 
} 

https://play.golang.org/p/W3bmlf15sF

編輯:另外值得注意的是,你不必包括結構的標籤,如果他們只是小寫字母的字段名稱,因爲JSON包匹配,只有大小寫不同領域(儘管它更喜歡精確的匹配,如果有歧義)。

+0

我對Go和結構很陌生,但這很棒。有用。非常感謝! – shishh03

+0

如果A是「interface {}」而不是「int」,該怎麼辦?我的api調用有時會返回一個空值,我需要能夠在結構中處理該響應。我知道如何將「J」float64存儲到一個變量,但是,如果J爲null,我會得到一個錯誤。我將J float64更改爲J interface {}。但不知道如何將接口{}的值存儲到變量中 – shishh03

+0

如果'J'是一個'interface {}',則需要檢查它是否爲零,然後鍵入斷言它爲任何類型。例如:https://play.golang.org/p/inXq03UDUL – Kaedys