При реализации сериализации статического класса я столкнулся с проблемой преобразования типов. Мой код:
var properties = type.GetProperties(BindingFlags.Static | BindingFlags.Public);
var dictionary = JsonSerializer.Deserialize<Dictionary<string, object>>(File.ReadAllText(filePath));
foreach (var property in properties) {
property.SetValue(null, dictionary[property.Name]);
}
При запуске возникает исключение:
System.ArgumentException: 'Object of type 'System.Text.Json.JsonElement' cannot be converted to type 'System.String'.'
Как записать значения из словаря десериализации?
Я попробовал перебрать значения словаря и преобразовать их к нужному типу.
foreach (var property in properties) {
var value = (JsonElement)dictionary[property.Name];
var json = value.GetRawText();
JsonSerializer.Deserialize<object>(json);
}
🤔 А знаете ли вы, что...
C# поддерживает LINQ (Language Integrated Query) для удобного запроса и обработки данных.
Не углубляясь в то, почему вы хотите это сделать (возможно, вам не следует), с чисто технической точки зрения вы можете использовать базовый тип для такой десериализации — JsonElement
и использовать его метод Deserialize
, принимающий экземпляр Type
. Например:
var dictionary = JsonSerializer.Deserialize<Dictionary<string, JsonElement>>(File.ReadAllText(filePath));
foreach (var property in properties)
{
property.SetValue(null, dictionary[property.Name].Deserialize(property.PropertyType));
}
Или через JsonNode
API, делая то же самое:
var dictionary = JsonNode.Parse(File.ReadAllText(filePath));
foreach (var property in properties)
{
property.SetValue(null, dictionary[property.Name].Deserialize(property.PropertyType));
}
Но лично я бы десериализовал какой-нибудь нестатический тип, а затем сопоставил свойства (также, возможно, в настоящее время статические классы нужны не так уж часто, и это вопрос, стоит ли вам вообще их использовать).