Полиморфная сериализация JSON — частая задача при проектировании API, UI-моделей или событийных структур. Пример структуры:
[
{"type": "text", "content": "hello"},
{"type": "image", "url": "pic.jpg"}
]
В Go такие данные принято представлять с помощью интерфейсов. Однако стандартный пакет encoding/json
не умеет автоматически сериализовать и десериализовать структуры с полем-дискриминатором (например, "type"
), которое определяет конкретный подтип. Приходится либо использовать громоздкие конструкции вроде map[string]any
или json.RawMessage
, либо вручную реализовывать интерфейсы json.Marshaler
и json.Unmarshaler
с разбором каждого варианта — такой подход быстро становится неудобным и слабо масштабируется.
Для решения этой задачи были разработаны две библиотеки:
poly
— обёртка с использованием дженериков;
polygen
— генератор кода, расширяющий возможности poly
.