【问题标题】:How do I serialize a map of type [string]reflect.Value?如何序列化 [string]reflect.Value 类型的映射?
【发布时间】:2018-09-23 21:09:52
【问题描述】:

我一直在尝试弄清楚如何让它发挥作用,但我被卡住了。

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

type PropSet map[string]*Prop

type Prop struct {
    val reflect.Value
}

我需要生成它所拥有的所有键值对的 JSON 表示。我一直在阅读关于如何编组更普通类型的帖子,但我一直无法弄清楚如何处理 reflect.Value 类型。我想我应该能够做这样简单的事情:

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

...但它只是不工作。有什么建议吗?

附加说明:我没有写数据结构,但我认为它使用 reflect.Value 作为映射值的原因是我们期望的值可以是整数、浮点数、字符串等。所以这本质上需要对基接口进行某种类型推断以找出返回结果。

【问题讨论】:

    标签: go marshalling


    【解决方案1】:

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

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

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

    Playground link

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

    【讨论】:

    • 成功了,感谢您的洞察力。只需传回接口本身,编组器就能够正确确定底层类型。
    猜你喜欢
    • 2014-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-20
    • 1970-01-01
    • 2015-02-24
    相关资源
    最近更新 更多