我一直在努力寻找如何使它正常工作的方法,但是我陷入了困境。
我有一个看起来像这样的对象:
type PropSet map[string]*Prop
type Prop struct {
val reflect.Value
}
,我需要生成它所保存的所有键值对的JSON表示形式。我一直在阅读有关如何封送更多普通类型的SO文章,但我一直无法弄清楚如何处理reflect.Value类型。我想我应该可以做这样简单的事情:
func (p Prop) MarshalJSON() ([]byte, error) {
return json.Marshal(p.val.Value().Interface())
}
...但是它不起作用。有什么建议吗?
附加说明:我没有写数据结构,但是我认为它使用了reflect.Value作为映射值的原因是我们期望的值可以是整数,浮点数,字符串等。本质上,这需要对基本接口进行某种类型的推断,以得出返回结果。
答案 0 :(得分:2)
您快到了:Value
本身没有MarshalJSON
接收者方法,也不需要。将您的func (p Prop) MarshalJSON() ([]byte, error) {
return json.Marshal(p.val.Interface())
}
实现更改为以下工作:
.Value()
(即从函数调用链中删除reflect
)。
(我不喜欢在这里使用{{1}} –依赖反射的解决方案很少清晰易懂,但似乎除了选择不使用它之外,您无法更改上游数据结构。)