0

这是代码

package main

import (
    "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 中,然后安全地取回?

4

1 回答 1

1

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

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

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

于 2013-08-17T18:40:31.973 回答