1 回答
TA贡献1825条经验 获得超4个赞
在解码方面,您可以为自定义类型编写自定义解组器:
type MaybeInt struct {
Present bool
Null bool
Value int64
}
func (m *MaybeInt) UnmarshalJSON(data []byte) error {
s := string(data)
m.Present = true
if s == "null" {
m.Null = true
return nil
}
v, err := strconv.ParseInt(s, 10, 64)
m.Value = v
return err
}
完整的例子在这里。不幸的是,这在编码方面不起作用:MarshalJSON处理程序无法指示该字段为空。显而易见的方法是nil, nil从 Marshaler 返回,但这不起作用。也不回[]byte{}, nil。
你可能会想:好吧,让我们使用一个指针,并将它设置为nil当我们想说该字段应该被省略时。这适用于解码端,但现在编码端失败了,因为编码器看到文字null并且根本不调用我们的编码器!
最终,我们可以将这两种技术结合起来:读入MaybeInt、编码(写入)*MaybeInt。我们需要并行结构类型。我们可以根据输入类型设置输出类型。我不认为这很漂亮,而且其中的reflect代码很糟糕(你也可以看到我所有的调试痕迹),但这实际上似乎有效:Playground link。在实践中reflect,您可能只为每个“可能”值的情况编写一个函数,而不是使用 。
- 1 回答
- 0 关注
- 155 浏览
添加回答
举报