将结构体自定义解组为切片映射
在 Go 中,当默认解组行为不够时,可以使用自定义解组。考虑以下场景:具有映射字段的结构,需要使用动态键从 JSON 对象填充。
示例问题
提供的代码演示了一种尝试将 JSON 响应解组到包含切片结构映射的结构中(Pair map[string][]Candles)。然而,解组后映射仍然是空的。
解决方案:选择更简单的结构
一个简单的解决方案是消除映射并修改结构以与JSON 结构:
<code class="go">type OHLC_RESS struct { Pair []Candles `json:"XXBTZUSD"` Last int64 `json:"last"` }</code>
使用 JSON.Unmarshaler 进行自定义解组
或者,为了保留基于映射的结构,需要自定义实现 json.Unmarshaler 接口。这种方法提供了对解组过程的完全控制。
实现细节:
代码片段:
<code class="go">func (r *OHLC_RESS) UnmarshalJSON(d []byte) error { // Decode keys only. var obj map[string]json.RawMessage if err := json.Unmarshal(d, &obj); err != nil { return err } // Decode "last" element. if last, ok := obj["last"]; ok { if err := json.Unmarshal(last, &r.Last); err != nil { return err } delete(obj, "last") } // Decode remaining elements into Pair map. r.Pair = make(map[string][]Candles, len(obj)) for key, val := range obj { cc := []Candles{} if err := json.Unmarshal(val, &cc); err != nil { return err } r.Pair[key] = cc } return nil }</code>
以上是如何在 Go 中将带有切片映射的结构体解组为切片映射?的详细内容。更多信息请关注PHP中文网其他相关文章!