Мне нужно сериализовать и десериализовать множество различных классов в моем проекте.
Многие из этих классов имеют свойства с частным или внутренним установщиком, но для меня важно десериализовать и эти свойства.
Использование параметризованного конструктора не является вариантом, поскольку мне нужно сохранять ссылки во время прохождения 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#
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Сопоставление нескольких имен свойств JSON с одним и тем же свойством в System.Text.Json.
Anonymous » » в форуме C# - 0 Ответы
- 20 Просмотры
-
Последнее сообщение Anonymous
-