десериализацией и не могу додуматься, как десериализовать класс используя атрибуты из реализованного интерфейса
Пример:
public interface IModel
{
[JsonPropertyName("value")]
string Value { get; set; }
}
public class Model : IModel
{
public string Value { get; set; }
}
Когда я по дефолту делаю десериализацию, оно не подтягивает атрибуты с интерфейса:
JsonSerializer.Serialize(new Model { Value = "text" });
Оно запишет это как
{"Value": "text"}
а нужно
{"value": "text"}
Это касается и любых других атрибутов, включая JsonIgnore, JsonConverter, JsonNumberHandling, etc.
Я пытался написать кастомный конвертер и если на запись проблем не возникло, то со чтением есть нюансы
Вот на чём я остановился:
https://gist.github.com/vova-lantsov-dev/bb943fb178b2e1bb51f83248692b8e87
С одной стороны я уже где-то рядом, но пишет ошибку NoMetadataForTypeProperties
А если начать сейчас ещё для свойств писать логику генерации метаданных по типу как здесь https://github.com/dotnet/runtime/issues/65306 через метод JsonMetadataServices.CreatePropertyInfo то хз - правильным ли я путём иду, полностью переписывая логику
Есть у кого идеи как это обойти?
P.S. Сразу объясню почему атрибуты именно на интерфейсы вешаются - атрибуты создаются сорс генератором при билде, генерируя сотни атрибутов для готовых классов. Сорс ген не может менять существующие файлы, только создавать новые. Можно было бы генерировать partial классы, но нет фичи partial properties ещё 🙁
возможно надо явно кастить в IModel?
Почему бы тебе не генерировать сами дтохи?
Они уже давным давно написаны, и их очень много Прописывать в каждом классе вручную атрибуты нужные это можно убиться
Сделай полиморфный десериализатор
Так я не предлагаю прописывать вручную, я предлагаю генерить дтохи на написанные дтохи, и использовать сгенеренные. Назвать как-нибудь ...HttpDto, потом массренеймом по проекту заменить использование старых на новые.
Как вариант, рассмотрю
для этого нужно генерить маппинг из одной дто в другую. проще указать конкретный конвертер, который будет использовать дефолтную логику для класса для типа
Это будет работать в любом случае, с абсолютно любым сериализатором.
гемор с коллекциями и дикшинарями
Делай их конкретного типа, или коллекции варианта
STJ — полная херня, и из коробки не поддерживает именно этот кейс с полиморфной десериализацией. Послушай доброго совета и просто юзай Ньютонсофт.
https://youtu.be/_pPAhQI-SsA
Обсуждают сегодня