Преобразование JsonElement в тип свойства

При реализации сериализации статического класса я столкнулся с проблемой преобразования типов. Мой код:

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) для удобного запроса и обработки данных.


1
50
1

Ответ:

Решено

Не углубляясь в то, почему вы хотите это сделать (возможно, вам не следует), с чисто технической точки зрения вы можете использовать базовый тип для такой десериализации — 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));
}

Но лично я бы десериализовал какой-нибудь нестатический тип, а затем сопоставил свойства (также, возможно, в настоящее время статические классы нужны не так уж часто, и это вопрос, стоит ли вам вообще их использовать).