json - 在特定结构中解码 Json 数据

标签 json struct go

我想在 Go 中解码以下 JSON 数据:

b := []byte(`{"Asks": [[21, 1], [22, 1]] ,"Bids": [[20, 1], [19, 1]]}`)

我知道怎么做,我定义了一个这样的结构:

type Message struct {
    Asks [][]float64 `json:"Bids"`
    Bids [][]float64 `json:"Asks"`
}

我不知道是否有一种简单的特化方法 这个多一点。 我希望在解码后以如下格式获取数据:

type Message struct {
    Asks []Order `json:"Bids"`
    Bids []Order `json:"Asks"`
}

type Order struct {
    Price float64
    Volume float64
}

这样我以后可以像这样解码后使用它:

m := new(Message)
err := json.Unmarshal(b, &m)
fmt.Println(m.Asks[0].Price)

我真的不知道如何在 GO 中轻松或惯用地做到这一点 所以我希望有一个很好的解决方案。

最佳答案

您可以通过实现 json.Unmarshaler interface 来做到这一点在您的 Order 结构上。应该这样做:

func (o *Order) UnmarshalJSON(data []byte) error {
    var v [2]float64
    if err := json.Unmarshal(data, &v); err != nil {
        return err
    }
    o.Price = v[0]
    o.Volume = v[1]
    return nil
}

这基本上是说 Order 类型应该从 float 的 2 元素数组而不是结构(对象)的默认表示中解码。

您可以在此处试用此示例:http://play.golang.org/p/B35Of8H1e6

关于json - 在特定结构中解码 Json 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26511417/

相关文章:

python - 在外部文件中存储字典、正则表达式和变量的最佳方式?

jQuery 绑定(bind)和 getJSON 组合的行为不符合预期

c++ - 显示结构/类错误数组 C++

c++ - 返回 vector 堆栈引用时出现问题

session - session 实现中的注册表

json - Linux CLI - 如何从 JSON jq + grep 获取子字符串?

python - 值错误 : malformed string using ast. literal_eval

使用 struct 和 scanf 的 C 程序产生错误 : expected expression before ‘ROBOT’

docker - 无法使用docker镜像在gitlab-ci中编译golang项目

go - 如何使用 Golang 自定义扫描器字符串文字和扩展内存将整个文件加载到内存中?