Десериализовать строку 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);
}