如何序列化 [string]reflect.Value 类型的地图?
How do I serialize a map of type [string]reflect.Value?
我一直在努力弄清楚如何让它工作,但我被卡住了。
我有一个看起来像这样的对象:
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 作为映射值的原因是我们期望的值可以是整数、浮点数、字符串等。因此,这本质上需要对基本接口进行某种类型推断,以确定 return 结果。
您快完成了:reflect.Value
本身没有 Value
接收器方法,也不需要。将您的 MarshalJSON
实施更改为以下工作:
func (p Prop) MarshalJSON() ([]byte, error) {
return json.Marshal(p.val.Interface())
}
(即从函数调用链中删除 .Value()
)。
(我不喜欢这里使用reflect
——依靠反射的解决方案很少清晰易懂,但似乎你不能改变上游数据结构,除了选择不使用它.)
我一直在努力弄清楚如何让它工作,但我被卡住了。
我有一个看起来像这样的对象:
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 作为映射值的原因是我们期望的值可以是整数、浮点数、字符串等。因此,这本质上需要对基本接口进行某种类型推断,以确定 return 结果。
您快完成了:reflect.Value
本身没有 Value
接收器方法,也不需要。将您的 MarshalJSON
实施更改为以下工作:
func (p Prop) MarshalJSON() ([]byte, error) {
return json.Marshal(p.val.Interface())
}
(即从函数调用链中删除 .Value()
)。
(我不喜欢这里使用reflect
——依靠反射的解决方案很少清晰易懂,但似乎你不能改变上游数据结构,除了选择不使用它.)