Десериализовать строку JSON в класс с отражением

Я пытаюсь десериализовать строку JSON в пользовательский класс. Я должен использовать отражение. У меня есть словарь, который я сериализую, отправляю в метод HttpPut, десериализую строку JSON и читаю поля словаря. Вот что у меня так далеко:

Я помещаю значения в словарь так:

Dictionary<string, object> valuesToUpdate = new Dictionary<string, object>();
Person p = new Person();
p.personName = "OrigName";
p.age = "25";
p.isAlive = true;
valuesToUpdate.Add("Person", p);
valuesToUpdate.Add("Length", 64.0);

Я использую JSON для его сериализации следующим образом:

string jsonString = JsonConvert.SerializeObject(valuesToUpdate);

Затем я беру jsonString и отправляю его в метод PEST API REST. Метод PUT обновляет различные переменные в пользовательском объекте на основе значений Key в словаре, используя отражение (в этом примере я обновляю customObject.Person и customObject.Length).

Вызов PUT десериализует jsonString следующим образом:

Dictionary<string, object> newFields = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);

Я перебираю newFields и хочу использовать отражение для обновления класса PersonObject "Person". Это мой метод HttpPut, который читает jsonString:

[HttpPut("/test/stuff")]
public string PutContact([FromBody]dynamic jsonString)
{
    Dictionary<string, object> newFields = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
    foreach (var field in newFields)
    {
        Console.WriteLine("\nField key: " + field.Key);
        Console.WriteLine("Field value: " + field.Value + "\n");

        PropertyInfo propInfo = typeof(Contact).GetProperty(field.Key);
        Type propertyType = propInfo.PropertyType;
        var value = propInfo.GetValue(contactToUpdate, null);

        if (propertyType.IsClass)
        {
            propInfo.SetValue(contactToUpdate, field.Value, null);
        }
    }
}

Это генерирует ошибку:

Объект типа Newtonsoft.Json.Linq.JObject'не может быть преобразован в тип'Person';

Я также пытался использовать метод PopulateObject JSON, но он вернул эту ошибку:

Newtonsoft.Json.JsonSerializationException: Невозможно заполнить объект JSON типом Person. Путь 'personName', строка 1....

Итак, в принципе, как вы можете взять строку JSON, преобразовать ее в класс (в моем случае это класс Person) и установить его в поле Person в customObject с отражением?

1 ответ

Решение
if (propertyType.IsClass)
{
    propInfo.SetValue(contactToUpdate, ((JObject)field.Value).ToObject(propertyType), null);
}
Другие вопросы по тегам