如何序列化[string] reflect.Value类型的映射?

时间:2018-09-23 21:09:52

标签: go marshalling

我一直在努力寻找如何使它正常工作的方法,但是我陷入了困境。

我有一个看起来像这样的对象:

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作为映射值的原因是我们期望的值可以是整数,浮点数,字符串等。本质上,这需要对基本接口进行某种类型的推断,以得出返回结果。

1 个答案:

答案 0 :(得分:2)

您快到了:Value本身没有MarshalJSON接收者方法,也不需要。将您的func (p Prop) MarshalJSON() ([]byte, error) { return json.Marshal(p.val.Interface()) } 实现更改为以下工作:

.Value()

(即从函数调用链中删除reflect)。

Playground link

(我不喜欢在这里使用{{1}} –依赖反射的解决方案很少清晰易懂,但似乎除了选择不使用它之外,您无法更改上游数据结构。)