@dimuska139
Backend developer

Как в Go правильно десериализовать JSON в структуру?

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
}
  • Вопрос задан
  • 365 просмотров
Решения вопроса 1
bitniks
@bitniks
Go/PHP/Symfony developer
Проверить не могу, но, наверное, так
if string(data) == "[]" {
    return nil
  }
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы