2015-06-14 2 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() 

КСТАТИ Это также избыточное, что вы передаете тип указателя, извлекая его Elem(), затем выделяя указатель. Сделайте что-нибудь вот так:

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

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

тогда вы можете передать обе указатели и указатели без функции.

Edit: Рабочая площадка Пример: http://play.golang.org/p/TPafxcpIU5

+0

Tanx, тестировал, но я получил тот же результат – Mohsen

+0

@Mohsen Я делаю ту же самую вещь в моем коде, и она прекрасно работает. Вы уверены, что есть данные? –

+0

@Mohsen Я создал упрощенный рабочий пример на игровой площадке. См. Отредактированный текст ответа. –

Смежные вопросы