为了账号安全,请及时绑定邮箱和手机立即绑定

Json 解组reflect.Type

Json 解组reflect.Type

Go
偶然的你 2021-06-26 18:02:53
package mainimport (    "fmt"    "encoding/json"    "reflect")var(    datajson []byte)type User struct {    Name string    Type reflect.Type}func MustJSONEncode(i interface{}) []byte {    result, err := json.Marshal(i)    if err != nil {        panic(err)    }    return result}func MustJSONDecode(b []byte, i interface{}) {    err := json.Unmarshal(b, i)    if err != nil {        panic(err)    }}func Store(a interface{}) {    datajson = MustJSONEncode(a)    fmt.Println(datajson)}func Get(a []byte, b interface{}) {    MustJSONDecode(a, b)    fmt.Println(b)}func main() {    dummy := &User{}    david := &User{Name: "DavidMahon"}    typ := reflect.TypeOf(david)    david.Type = typ    Store(david)    Get(datajson, dummy)}我可以成功编组,reflect.Type但是当我做相反的事情时,它会恐慌。我知道reflect.Type是一个接口。那么我在这里做错了什么?如何reflect.Type在 json 中存储一个值然后安全地检索回来?
查看完整描述

1 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

那没有意义。JSON 包无法知道应该解码哪些数据。这个接口可能由一个struct{}类型、一个int类型甚至一个struct{ Value1, Value2 int }类型来实现。更糟糕的是,可能还有其他类型,它们甚至不是二进制文件的一部分(缺少导入、死代码消除等)。那么,您希望从 JSON 返回哪种类型?

您可能需要找到另一种方法。例如,您可以实现json.Unmarshaler接口,解组标识符并使用该标识符将以下数据解组为具体类型。您可能需要的 switch 语句还将确保具体类型是您的二进制文件的一部分(因为您正在使用它)。

但可能有一个更简单的解决方案。不过,您的问题并没有说明您要存档的内容。仅将类型的名称编组/解组为字符串就足够了吗?


查看完整回答
反对 回复 2021-06-28
  • 1 回答
  • 0 关注
  • 222 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信