我在Go中使用Add,Remove,Difference,Union等基本操作实现了Set数据结构。我试图使用json编码器发送一个http请求来编码包含map[string]Set
形式的对象的请求主体。 Set数据结构定义如下:
type Set map[interface{}]struct{}
func NewSet() Set {
set := make(Set)
return set
}
编码器如下所示:
func (req *Request) BodyContentInJson (val interface{}) error {
buf := bytes.NewBuffer(nil)
enc := json.NewEncoder(buf)
if err := enc.Encode(val); err != nil {
return err
}
req.Obj = val
req.Body = buf
req.BodySize = int64(buf.Len())
return nil
}
此代码在
处失败if err := enc.Encode(val); err != nil {
return err
}
发出错误:{"errors":["json: unsupported type: Set"]}
。此外,调试时val
的类型为map[string]interface{}
。
我怎么可能使用Go的编码器编码和编组/解组JSON内容?
答案 0 :(得分:1)
您可以在UnmarshalJSON
类型上编写自己的*Set
方法,json.Encoder
将使用该方法将json数据编码为Set
。这是一个简单的例子https://play.golang.org/p/kx1E-jDu5e。
顺便说一下,您收到错误的原因是因为interface{}
包不支持encoding/json
类型的地图密钥。 (https://github.com/golang/go/blob/master/src/encoding/json/encode.go#L697-L699)