![](/img/trans.png)
[英]Convert string data in to a valida struct to store as json data using golang
[英]Convert json to struct using reflection in golang
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
}
稱呼它:
r,_:= deserialize(request,reflect.TypeOf(&testData{}))
它不會引發錯誤,並且對我來說看起來是完全有效的操作,但是結果是期望類型為空的結構。
有什么問題嗎?
問題是您要傳遞以下類型的非指針實例:
payload:=reflect.New(v).Elem().Interface()
意思是“為該類型分配一個新的指針,然后獲取它的值,並將其提取為interface{}
。
您應該將其保留在:
payload:=reflect.New(v).Interface()
順便說一句,傳遞一個指針的類型,提取它的Elem()
,然后分配一個指針也是多余的。 做這樣的事情:
if type.Kind() == reflect.Ptr {
typ = typ.Elem()
}
payload := reflect.New(typ).Interface()
那么您可以將指針和非指針都傳遞給該函數。
編輯:工作場所示例: http : //play.golang.org/p/TPafxcpIU5
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.