不导出类型的JSON编组

时间:2018-11-27 17:23:29

标签: json go marshalling unmarshalling

我要使用未导出的自定义类型,并定义一个接口以使用它。自定义类型将实现该接口,并且除从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
}

此方法将无法直接访问地图,并且会强制使用New()函数来创建“值”类型的对象。

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

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

可以通过使New()返回“值”而不是“值”来解决此问题,但是在尝试解组像这样的对象时仍然会出现问题:

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

有什么建议吗?在这种情况下,实施Unmarshaler无济于事。我使用以下示例创建一个转到代码段:https://play.golang.org/p/IEalgBCsTVR

1 个答案:

答案 0 :(得分:0)

您需要为json.Unmarshal()提供指向具体类型的指针。因此,更改(从链接的游乐场):

unm := New()

unm := New().(value)