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

标签 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 作为映射值的原因是我们期望的值可以是整数、 float 、字符串等。所以这本质上需要对基本接口(interface)进行某种类型推断,以确定返回结果。

最佳答案

您快到了:reflect.Value 本身没有 Value 接收方方法,也不需要。将您的 MarshalJSON 实现更改为以下工作:

func (p Prop) MarshalJSON() ([]byte, error) {
    return json.Marshal(p.val.Interface())
}

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

Playground link

(我不喜欢在这里使用reflect——依赖于反射的解决方案很少清晰易懂,但似乎你不能改变上游数据结构,除了选择不使用它。)

关于go - 如何序列化 [string]reflect.Value 类型的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52470276/

相关文章:

math - Go:如何划分巨大的数字?

c# - 来自另一个应用程序域的 CreateInstance 适用于控制台应用程序,但在单元测试时抛出 MissingMethodException

.net - 将 C# 字符串传递给非托管 C++ DLL

c# - C Dll 导入在 C# 中引发 Marshall 指令异常

ubuntu - 为什么探查器不适合我?

go - 并发文件系统扫描

xml - 使用 Go 解码 XML : How to find attributes with the same value?

Go 正在打印 xgcc 版本但不是 go 安装版本

go - 无法在 golang 中将数据从映射正确解码到结构

c# - 如何将 ProcessInfo 转换为 WTS_PROCESS_INFO