【发布时间】:2016-08-09 22:15:59
【问题描述】:
我的 JSON 看起来像这样:
{
"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]float32 `json:"a"`
B [][2]float32 `json:"b"`
C string `json:"c"`
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 转换为 Golang 中的结构,如下所示:
orders := new(OrderBook)
err = json.Unmarshal(JSON, &orders)
由于我无法定义类型结构来匹配 JSON,这将不起作用。做了一点阅读,我认为 Unmarshal-ing 成一个接口,然后通过类型检查使用接口数据可能是一个解决方案。
我是否朝着正确的方向前进?
一个模板显示我如何在界面中使用数据后会真正有帮助。
【问题讨论】:
-
我建议不要解组到接口中,同样的问题有更简单的解决方案。这里有一些建议可能会让您转向适当的解决方案。因此,一种选择是提供
UnmarshalJSON(gist.github.com/mdwhatcott/8dd2eef0042f7f1c0cd8) 的自定义实现,您可以在其中提供自定义逻辑以将字符串转换为双精度。另一种方法是保持一切不变,但只将那些内部数组定义为[]interface{}。您也可以在此之后进行转换,只是我建议您在那里尽可能具体。 -
对我来说,你最好改为制作标准 JSON。生成 JSON 的是外部程序还是你的程序?
-
我同意,如果您可以控制 json 的结构,那就更好了。但是,通常情况下您不会这样做,因此您可以使用我的答案。
-
@Apin 不幸的是,这些是生成 JSON 的外部服务。
标签: json go unmarshalling