Обычно enum с associated values + custom init(from:), дискриминатор-поле (type), или type erasure контейнер; синтез Codable сам полиморфизм не угадает.
Разбор
- Читайте
type/kind, затем decode соответствующую структуру.
decodeIfPresent для опциональных веток.
- Тестируйте неизвестные кейсы (forward compatibility).
- Кодогенерация иногда помогает, но руками — контроль.
Итог
Полиморфный JSON = ручной decode вокруг дискриминатора и enum-модели.