未导出类型的 JSON 编码

标签 json go marshalling unmarshalling

我想使用未导出的自定义类型并定义一个接口(interface)来使用它。自定义类型将实现该接口(interface),除了从 JSON 解码外,一切正常。

我创建了一个例子来更好地解释它:

type (
    Value interface {
        Set(k, v string)
    }

    value map[string]string
)

func New() Value {
    return value{}
}

func (val value) Set(k, v string) {
    val[k] = v
}

这种方法不会提供对 map 的直接访问,也不会强制使用 New() 函数来创建“Value”类型的对象。

当尝试在使用 New() 创建的对象中解码时,出现错误:

Failed to unmarshal value json: cannot unmarshal object into Go value of type main.Value

这可以通过使 New() 返回“value”而不是“Value”来解决,但在尝试解码对象时仍然是一个问题,例如:

Storage struct {
        Val Value `json:"val"`
}

有什么建议吗?在这种情况下,实现 Unmarshaler 没有帮助。我用这个例子创建了一个代码片段:https://play.golang.org/p/IEalgBCsTVR

最佳答案

您需要为 json.Unmarshal() 提供一个指向具体类型的指针。所以改变(从你链接的 Playground ):

unm := New()

unm := New().(value)

关于未导出类型的 JSON 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53504992/

相关文章:

javascript - 如何在vue组件中导入js文件?

java - 如何在 java 中正确格式化 JSON 字符串?

go - Go 中的相对路径

go - 水平自动缩放的 Kubernetes pod 不会从 Google Cloud Pub/Sub 订阅中提取消息

c++ - PInvoke 返回带有二维数组的结构

java - 将多个 JAXB 元素片段组合成一个根节点?

json - 哪个 bean 在 Spring Boot 中将对象转换为 Json?

go - 如何在没有 _test 的情况下进行测试

c# - 如何在托管代码中正确翻译 WH_MOUSE lparam

xml - 存储数百万简单数据的最节省空间的方法?