2013-08-17 21 views
0

Here is the code的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是一個接口。那麼我在這裏做錯了什麼?如何在json中存儲reflect.Type值,然後安全地取回?

回答

1

這沒有意義。 JSON包沒有辦法知道應該解碼哪些數據。該接口可以通過struct{}類型,int類型和struct{ Value1, Value2 int }類型來實現。更糟糕的是,還可能有其他類型,甚至不是二進制文件的一部分(缺少導入,死代碼刪除等)。那麼,你期望從JSON中獲得哪種類型?

您可能需要找到另一種方式。例如,您可以實現json.Unmarshaler接口,解組標識符並使​​用該標識符將以下數據解組爲一個具體類型。您可能需要的switch語句也將確保具體類型是二進制文件的一部分(因爲您正在使用它)。

但可能有一個更簡單的解決方案。你的問題並沒有告訴你想要存檔的內容。僅僅將字符串的名稱編組/字符串就足夠了?

+0

我想將數據(如某些類型的對象)存儲到數據庫中。爲了存儲這些數據,我需要將它編組爲json。我的對象包含反射細節(對象的「類型」)。所以基本上我可以存儲任何類型的數據並將其恢復。數據庫是我使用它的一種自定義數據庫。我只想要一種方法來存儲'reflect.Type'類型的數據並安全地將其恢復。 – Minty

+0

我想存儲這個類型的名字,但是我怎樣才能從中得到具體的類型?我很困惑 – Minty

+0

如果你想在數據庫中存儲不同類型的對象,你可以添加一個只包含類型名稱的「Type」字段。然後,在解碼基於該類型的真實對象之前,必須先解碼類型字段(只需解碼爲「struct {Type string}」)。 – tux21b