170 похожих чатов

Привет. Я тут в общем второй день долбаюсь с System.Text.Json

десериализацией и не могу додуматься, как десериализовать класс используя атрибуты из реализованного интерфейса

Пример:
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 ещё 🙁

12 ответов

19 просмотров

возможно надо явно кастить в IModel?

Почему бы тебе не генерировать сами дтохи?

Vova-Lantsov 🇺🇦 Автор вопроса
βλαδιμιρ
Почему бы тебе не генерировать сами дтохи?

Они уже давным давно написаны, и их очень много Прописывать в каждом классе вручную атрибуты нужные это можно убиться

Сделай полиморфный десериализатор

Vova Lantsov 🇺🇦
Они уже давным давно написаны, и их очень много Пр...

Так я не предлагаю прописывать вручную, я предлагаю генерить дтохи на написанные дтохи, и использовать сгенеренные. Назвать как-нибудь ...HttpDto, потом массренеймом по проекту заменить использование старых на новые.

βλαδιμιρ
Так я не предлагаю прописывать вручную, я предлага...

для этого нужно генерить маппинг из одной дто в другую. проще указать конкретный конвертер, который будет использовать дефолтную логику для класса для типа

Это будет работать в любом случае, с абсолютно любым сериализатором.

Ilya Chernoudov
гемор с коллекциями и дикшинарями

Делай их конкретного типа, или коллекции варианта

STJ — полная херня, и из коробки не поддерживает именно этот кейс с полиморфной десериализацией. Послушай доброго совета и просто юзай Ньютонсофт.

Похожие вопросы

Обсуждают сегодня

а через ESC-код ?
Alexey Kulakov
29
30500 за редактор? )
Владимир
47
Чёт не понял, я ж правильной функцией воспользовался чтобы вывести отладочную информацию? но что-то она не ловится
notme
18
У меня есть функция где происходит это: write_bit(buffer, 1); write_bit(buffer, 0); write_bit(buffer, 1); write_bit(buffer, 1); write_bit(buffer, 1); w...
~
13
Недавно Google Project Zero нашёл багу в SQLite с помощью LLM, о чём достаточно было шумно в определённых интернетах, которые сопровождались рассказами, что скоро всех "ибешни...
Alex Sherbakov
5
в JclConsole объявлено так: function CtrlHandler(CtrlType: DWORD): BOOL; stdcall; - где ваше объявление с stdcall? у вас на картинке нет stdcall
Karagy
8
Как передать управляющий символ в открытую через CreateProcess консоль? Собсна, есть процедура: procedure TRedirectThread.WriteData(Data: OEMString); var Written: Cardinal;...
Serjone
6
Ребят в СИ можно реализовать ООП?
Николай
33
program test; {$mode delphi} procedure proc(v: int32); overload; begin end; procedure proc(v: int64); overload; begin end; var x: uint64; begin proc(x); end. Уж не знаю...
notme
6
у вас два процесса. один посылает другому сигнал. у вас есть код обоих процессов? если всё не так - расскажите как оно на самом деле. а именно кто кому чего, есть-ли консоли,...
Karagy
6
Карта сайта