2015-06-14 38 views
1
func deserialize(request *http.Request,typ reflect.Type) (interface{}, *httpNet.HandlerError){ 

    data,e:=ioutil.ReadAll(request.Body) 
    fmt.Println(string(data)) 
    if e !=nil{ 
     return nil,&httpNet.HandlerError{e,"could not read request",http.StatusBadRequest} 
    } 

    v:=typ.Elem() 
    payload:=reflect.New(v).Elem().Interface() 

    eaa:= json.NewDecoder(request.Body).Decode(payload) 

    if e!=nil{ 
     fmt.Println(eaa.Error()) 
    } 
    fmt.Println(payload) 
    fmt.Println(reflect.ValueOf(payload) 
     ) 
    return payload,nil 

} 

叫它:JSON轉換爲結構使用反射在golang

r,_:= deserialize(request,reflect.TypeOf(&testData{})) 

它不會引發錯誤,看起來完全有效的操作給我,但結果是期望類型的空結構。

這是什麼問題?

回答

3

的問題是要傳遞的類型的非指針實例:

payload:=reflect.New(v).Elem().Interface() 

手段「分配一個新的指針類型,然後利用它的價值,並提取其作爲interface{}

你應該保持它在:

payload:=reflect.New(v).Interface() 

BTW這也是多餘的,你傳遞一個指針的類型,提取其Elem(),然後分配一個指針。做這樣的事情:

if type.Kind() == reflect.Ptr { 
    typ = typ.Elem() 
} 

payload := reflect.New(typ).Interface() 

那麼你可以傳遞兩個指針和非指針的功能。

編輯:工作操場例如:http://play.golang.org/p/TPafxcpIU5

+0

坦,測試,但我得到了同樣的結果 – Mohsen

+0

@Mohsen我在做同樣的事情在我的代碼和它完美的作品。你確定有數據進入嗎? –

+0

@Mohsen我在操場上創建了一個簡化的工作示例。查看答案的編輯文本。 –