2016-02-05 1 views
1

Я слежу за Golang Decoding Generic JSON Objects to One of Many Formats как способ развязать общий json. У меня будет множество разных типов, которые могут быть добавлены другими, поэтому заявления о случаях жесткого кодирования невозможны.unmarshalling generic json с карточкой типа поиска

Я также не хочу жестко задавать тип как строку, но пусть те, кто использует библиотеку, выбрали имя «lookup», если они захотят переименовать свои базовые структуры позже.

Я в основном ищу что-то вроде этого:

type myInterface interface { 
    Something() // irrelevant, just to show you It's not about interface{} 
} 

type myBar struct {}  // fulfils myInterface 
type mySomething struct {} // fulfils myInterface 

var types = make(map[string]type) // <--- Obvious Pseudo code ;) 
types["foo:bar"] = myBar  // done by whoever uses the library 
types["1230988"] = mySomething // ... 

type storageWrapper struct { 
    Type string 
    Data json.RawMessage 
} 

func loadSomething(id string) myInterface { 
    buf := db.load(id) // pseudo code but you get the idea 
    sw := &storageWrapper{} 
    json.Unmarshal(buf, sw) 

    // now the interesting part 
    targetType := types[sw.Type] 
    thing := &targetType{} 
    json.Unmarshal(sw.Data, thing) 
    return thing 
} 

я это чувство, что я overthinking всей проблемы. Или что я пытаюсь сгибаться. Входите во что-то, что противоречит его основополагающей философии. Я очень открыт и благодарен за любой совет, который предлагает другой подход ко всей проблеме.

ответ

0

typesmap[string]myInterface и зарегистрировать тип, иметь вызывающих абонентов для хранения пустого значения этого типа (а не ссылки) в карта. Затем, чтобы развязать, вы можете «получить тип», скопировав пустое значение из карты, развязав его и вернув (или ссылку на него). Значение интерфейса будет выполнять задачу определения того, какой тип требуется. Кроме того, если пользователи хотят по умолчанию использовать некоторые поля для ненулевых/пустых значений, если они не предусмотрены в JSON, они могут это сделать, сохраняя эти значения в структуре на карте типов.

+0

Принимая это как ответ, потому что он выполняет свою работу. Тем не менее, я изменил свой код до сих пор, поэтому он больше не полагается на карту типов – paukul

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