猿问

Json 解组reflect.Type

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 中存储一个值然后安全地检索回来?


偶然的你
浏览 223回答 1
1回答

ITMISS

那没有意义。JSON 包无法知道应该解码哪些数据。这个接口可能由一个struct{}类型、一个int类型甚至一个struct{ Value1, Value2 int }类型来实现。更糟糕的是,可能还有其他类型,它们甚至不是二进制文件的一部分(缺少导入、死代码消除等)。那么,您希望从 JSON 返回哪种类型?您可能需要找到另一种方法。例如,您可以实现json.Unmarshaler接口,解组标识符并使用该标识符将以下数据解组为具体类型。您可能需要的 switch 语句还将确保具体类型是您的二进制文件的一部分(因为您正在使用它)。但可能有一个更简单的解决方案。不过,您的问题并没有说明您要存档的内容。仅将类型的名称编组/解组为字符串就足够了吗?
随时随地看视频慕课网APP

相关分类

Go
我要回答