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 ответов

5 просмотров

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

А еще в перле можно уже @arr1 + @arr2?
Sergei Zhmylove
53
я не магистр хаскеля, но разве не может лейзи тип конвертнуться в не-лейзи запросив вычисление содержимого прям при инициализации?
deadgnom32 λ madao
100
Подскажите, где смотреть результат выполнения программы? Код: ;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, станда...
Егор Анелькин
5
Привет всем. появился вопрос. Разрабатываю сайт, в данный момент он запущен. Хостинг beget. Добавляю на сайт яндекс метрику с помощью полей client-settings (взято отсюда http...
Andrew
2
Добрый день подскажите пожалуйста может кто то сталкивался с ошибками Sentry 22.10.0 развернутым из helm чарт в Kubernetes? Изначально 3 дня назад очень стало много событий ух...
Tire4 Finist Devops
1
;.686 ;Система команд процессора 686 ;.MODEL FLAT,stdcall ;Модель памяти плоская, стандартный ;вызов процедуры ;option casemap:no...
Егор Анелькин
1
почому оно не работает?
Vi Chapmann Chapmann
19
Так а кто может спарсить всех участников чата? Идишники
Magic
18
а как ловят такое ghci> res <- getPos2 urlt 0 (alist !! 0) 200 ghci> res SearchAtom (Search "www.google.com" "/search?q=" "Haskell") "haskell.org" (SearchTS [(2024-05-06 07:...
Fedor
14
Есть вопрос: допустим есть железка с каким-то интерфейсом(допустим usb), но как по этому интерфейсу железкой управлять неизвестно, прог нету, а управлять очень хочется надо. К...
Mixail Frolov
15
Карта сайта