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 语句还将确保具体类型是您的二进制文件的一部分(因为您正在使用它)。
但可能有一个更简单的解决方案。不过,您的问题并没有说明您要存档的内容。仅将类型的名称编组/解组为字符串就足够了吗?
- 1 回答
- 0 关注
- 222 浏览
添加回答
举报
0/150
提交
取消