2016-08-09 19 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是有道理的情况下,这我不相信是其中之一。这并不比这里显示的简单得多。

相关问题