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
是一个界面。那么我在这里做错了什么?如何在json中存储reflect.Type
值然后安全地返回?
答案 0 :(得分:1)
这没有意义。 JSON包无法知道应该解码哪些数据。此接口可能由struct{}
类型,int
类型和struct{ Value1, Value2 int }
类型实现。更糟糕的是,可能还有其他类型,甚至不是你的二进制文件的一部分(缺少导入,死代码消除等)。那么,您希望从JSON返回哪种类型?
您可能需要找到另一种方式。例如,您可以实现json.Unmarshaler
接口,解组标识符并使用该标识符将以下数据解组为具体类型。您可能需要的switch语句也将确保具体类型是二进制文件的一部分(因为您正在使用它)。
但可能有一个更简单的解决方案。您的问题不会告诉您要归档的内容。将字符串的名称编组/解组为字符串是否足够?