【问题标题】:How to parse JSON arrays with two different data types into a struct in Golang如何将具有两种不同数据类型的 JSON 数组解析为 Golang 中的结构
【发布时间】: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


【解决方案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 有意义,我不认为这是其中之一。它并没有比这里显示的简单得多。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-12-17
    • 2015-10-21
    • 2016-10-11
    • 2022-11-28
    • 1970-01-01
    • 2022-10-18
    • 1970-01-01
    • 2014-11-28
    相关资源
    最近更新 更多