簡體   English   中英

在golang中使用反射將json轉換為結構

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM