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.Typejson に値を保存して安全に取得するにはどうすればよいですか?

4

1 に答える 1

1

それは意味がありません。JSON パッケージがどのデータをデコードする必要があるかを知る方法はありません。このインターフェースは、タイプ、タイプ、および場合によってはstruct{}タイプによって実装される場合があります。さらに悪いことに、バイナリの一部でさえない他のタイプも存在する可能性があります (インポートの欠落、デッド コードの削除など)。では、JSON から返されるのはどの型だと思いますか?intstruct{ Value1, Value2 int }

おそらく別の方法を見つける必要があります。たとえば、json.Unmarshalerインターフェイスを実装し、識別子を非整列化し、その識別子を使用して次のデータを具体的な型に非整列化することができます。おそらくそのために必要になるswitchステートメントは、具象型がバイナリの一部であることも保証します(使用しているため)。

しかし、おそらくもっと簡単な解決策があります。あなたの質問は、あなたがアーカイブしたいものを伝えていません。型の名前を文字列としてマーシャリング/アンマーシャリングするだけで十分でしょうか?

于 2013-08-17T18:40:31.973 に答える