Полиморфная сериализация 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.