API отдаёт json-объект, одно из полей которого - вложенный объект. Но если этого вложенного объекта нет, то в ответе в этом поле приходит не null, а двойные скобки (пустой массив). То есть, как я понимаю, это вообще разные типы (либо массив, либо объект). Как это дело правильно десериализовать в структуру так, чтобы в соответствующем поле структуры был либо указатель на объект, если он есть, либо nil?
Попробовал вот так, но это не совсем то получается, потому что в Goals не nil, а &{nil}. Это так потому, что неинициализированная структура - это не nil.
type Conversion struct {
TotalConversions *int `json:"total_conversions,omitempty"`
Goals *ConversionBlock `json:"maintrigger,omitempty"` // Это вложенный объект, при отсутствии которого тут []
}
type block struct {
ID *int `json:"id,omitempty"`
Name *string `json:"name,omitempty"`
Created *DateTime `json:"created,omitempty"`
}
type ConversionBlock struct {
*block
}
func (d *ConversionBlock) UnmarshalJSON(data []byte) error {
if string(data) == "[]" {
*d = ConversionBlock{}
return nil
}
var bl block
err := json.Unmarshal(data, &bl)
if err != nil {
return errors.New("UnmarshalJSON: " + err.Error())
}
*d = ConversionBlock{
&bl,
}
return nil
}