Мне нужно сериализовать и десериализовать множество различных классов в моем проекте.
Многие из этих классов имеют свойства с частным или внутренним установщиком, но для меня важно десериализовать и эти свойства.
Использование параметризованного конструктора не является вариантом, поскольку мне нужно сохранять ссылки во время прохождения 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
Пользовательский преобразователь System.Text.Json для включения десериализации свойств частного установщика ⇐ C#
Место общения программистов C#
1727042282
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;}
Подробнее здесь: [url]https://stackoverflow.com/questions/79012248/system-text-json-custom-converter-to-enable-deserialisation-of-private-setter-pr[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия