2016-08-09 51 views
0

我有JSON,看起來像這樣:如何解析兩種不同的數據類型JSON數組到一個結構中Golang

{ 
 
    "a": [ 
 
      [ 
 
       "12.58861425", 
 
       10.52046452 
 
      ], 
 
      [ 
 
       "12.58861426", 
 
       4.1073 
 
      ] 
 
     ] 
 
    "b": [ 
 
      [ 
 
       "12.58861425", 
 
       10.52046452 
 
      ], 
 
      [ 
 
       "12.58861426", 
 
       4.1073 
 
      ] 
 
     ] 
 
    "c": "true" 
 
    "d": 1234 
 
} 
 
    

我想解組到我創建了一個結構如下:

type OrderBook struct { 
 
\t A [][2]float32 `json:"a"` 
 
\t B [][2]float32 `json:"b"` 
 
     C string `json:"c"` 
 
\t D uint32 `json:"d"` 
 
} 
 

 
//Note this won't work because the JSON array contains a string and a float value pair rather than only floats.

通常我會再轉換這個JSON成一個struct在Golang像這樣:

orders := new(OrderBook) 
 
err = json.Unmarshal(JSON, &orders)

既然不能定義類型結構相匹配的JSON這是不行的。做一些閱讀,我認爲解組入界面,然後通過類型檢查使用界面數據可能是一個解決方案。

我正在朝着正確的方向前進嗎?
一個模板展示瞭如何在界面中使用數據的過程中真的有所幫助。

+0

我會建議反編組到接口,有相同的問題更簡單的解決方案。這裏有幾條建議可能會讓你朝着適當的解決方案邁進。因此,一種選擇是提供'UnmarshalJSON'的定製實現(https://gist.github.com/mdwhatcott/8dd2eef0042f7f1c0cd8),您將在其中提供自定義邏輯以將字符串轉換爲雙精度。另一個將保持一切都一樣,但只是將這些內部數組定義爲一個'[] interface {}'。你也可以在此之後進行轉換,只是我會建議儘可能具體。 – evanmcdonnal

+0

對我來說,最好是讓你製作標準的JSON。生成JSON的人是外部程序還是程序? – Apin

+0

我同意,如果你能控制json的結構,那還會更好。但是,通常情況下你不這樣做,所以你可以使用我的答案。 – Dale

回答

1

爲什麼不直接聲明A和B切片的類型就像這樣?

data := []byte(`{"a": [["12.58861425",10.52046452],["12.58861426",4.1073]],"b": [["12.58861425",10.52046452],["12.58861426",4.1073]],"c": "true","d": 1234}`) 

type OrderBook struct { 
    A [][2]interface{} `json:"a"` 
    B [][2]interface{} `json:"b"` 
    C string   `json:"c"` 
    D uint32   `json:"d"` 
} 
orders := new(OrderBook) 
err := json.Unmarshal(data, &orders) 
if err != nil { 
    fmt.Printf(err.Error()) 
} else { 
    fmt.Printf("%s\n", orders.A[0][0].(string))  
    fmt.Printf("%f\n", orders.A[0][1].(float64)) 
} 

有在操場上的例子:https://play.golang.org/p/0MUY-yOYII

我必須evanmcdonnal不同意,當然也有地方使用滾動在您自己的Unmarshaller是有道理的情況下,這我不相信是其中之一。這並不比這裏顯示的簡單得多。

相關問題