2013-09-16 2 views
1

В настоящее время этот метод я использую для преобразования карты [строка] интерфейс {}, чтобы сообщение STRUCTКарта <-> структура типа литья

byteBlob, err := json.Marshal(messageMap) 
if err != nil { 
    return nil, err 
} 

message := &Message{} 
err = json.Unmarshal(byteBlob, message) 
if err != nil { 
    return nil, err 
} 

Я нашел пакет JSon взломать мой путь через это, но то, что является правильным способ сделать это преобразование? очевидно, без использования пакета json

ответ

2

В пакете encoding/json используется пакет reflect для маршалинга и рассылаемых сообщений.

Вы можете сделать то же самое с reflect. Если вам не нужна поддержка для вложенных структур и массивов, следующие должны сделать трюк:

message := Message{} 

v := reflect.ValueOf(&message).Elem() 
for key, value := range messageMap { 
    field := v.FieldByName(key) 
    if !field.IsValid() { 
     // or handle as error if you don't expect unknown values 
     continue 
    } 
    if !field.CanSet() { 
     // or return an error on private fields 
     continue 
    } 
    field.Set(reflect.ValueOf(value)) 
} 

Вы можете поэкспериментировать с этим кодом in the playground.

+0

Не забудьте проверить, что поле 'field.PkgPath' является пустой строкой (экспортированные поля). Попытка «Установить» в неэкспонированное поле будет паниковать. – thwd

+1

Хорошая точка. Я добавил проверку CanSet() на фрагмент кода примера. –

+0

Есть также существующие пакеты, делающие эту магию. Я еще не использовал его сам, но, например: https://github.com/mitchellh/mapstructure –

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