编码在Golang中设置数据结构

时间:2017-03-13 23:41:30

标签: json go encoding interface set

我在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内容?

1 个答案:

答案 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