Пользовательский преобразователь System.Text.Json для включения десериализации свойств частного установщикаC#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Пользовательский преобразователь System.Text.Json для включения десериализации свойств частного установщика

Сообщение Anonymous »

Мне нужно сериализовать и десериализовать множество различных классов в моем проекте.
Многие из этих классов имеют свойства с частным или внутренним установщиком, но для меня важно десериализовать и эти свойства.
Использование параметризованного конструктора не является вариантом, поскольку мне нужно сохранять ссылки во время прохождения Json.
Добавление [JsonInclude] сработало бы, но тогда у меня есть чтобы добавить это к сотням свойств.
Поэтому я попытался написать пользовательский преобразователь, который просто выполняет десериализацию по умолчанию, за исключением того, что используются все установщики свойств.
Но все мои версии заканчиваются какой-то ошибкой: если ссылки не сохраняются во время десериализации, иногда вызовы рекурсивного преобразователя приводят к исключению переполнения стека....
Кто-нибудь создал что-то подобное?
Или есть простой способ сделать это?
ОБНОВЛЕНИЕ:
Я использую .net8, и генерация исходного кода не планируется.
Вот моя текущая версия конвертера:
public override T? Read(ref Utf8JsonReader reader, Type typeToConvert, JsonSerializerOptions options){

var newOptions = new JsonSerializerOptions(options);

newOptions.Converters.Clear();

Dictionary? dict = JsonSerializer.Deserialize(ref reader, newOptions);

if (dict != null)
{
T? obj = (T?)Activator.CreateInstance(typeof(T), true);

foreach (var prop in typeof(T).GetProperties(BindingFlags.Public | BindingFlags.NonPublic | BindingFlags.Instance))
{
if (dict.TryGetValue(prop.Name, out var value))
if (prop.CanWrite)
{
object? convertedValue;

if (value is JsonElement jsonElement)
{
if (prop.PropertyType == typeof(int))
{
convertedValue = jsonElement.GetInt32();
}
else if (prop.PropertyType == typeof(string))
{
convertedValue = jsonElement.GetString();
}
else if (prop.PropertyType == typeof(double))
{
convertedValue = jsonElement.GetDouble();
}
else if (prop.PropertyType == typeof(bool))
{
convertedValue = jsonElement.GetBoolean();
}
else
{
convertedValue = jsonElement.Deserialize(prop.PropertyType, options);
}
}
else
{
convertedValue = Convert.ChangeType(value, prop.PropertyType);
}
prop.SetValue(obj, convertedValue);

}
}
return obj;
}
return default;}


Подробнее здесь: https://stackoverflow.com/questions/790 ... -setter-pr
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»