Json Unmarshal reflect.Type

时间:2013-08-17 18:22:48

标签: json reflection go

Here is the code

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值然后安全地返回?

1 个答案:

答案 0 :(得分:1)

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

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

但可能有一个更简单的解决方案。您的问题不会告诉您要归档的内容。将字符串的名称编组/解组为字符串是否足够?