我试图将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并将其发送到REST API PUT方法。 PUT方法使用反射基于字典中的键值更新自定义对象上的各种变量(在此示例中,我更新了customObject.Person和customObject.Length)。
PUT调用反序列化jsonString,如下所示:
Dictionary<string, object> newFields = JsonConvert.DeserializeObject<Dictionary<string, object>>(jsonString);
我遍历newFields并希望使用反射来更新customObject&#34; Person&#34;类。这是我的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类型的对象&#39;无法转换为&#39; Person&#39;;
我也尝试过使用JSON的PopulateObject方法但是它返回了这个错误:
Newtonsoft.Json.JsonSerializationException:无法将JSON对象填充到类型&#39; Person&#39;。路径&#39; personName&#39;,第1行......
所以基本上,你如何去获取一个JSON字符串,将它转换为一个类(在我的情况下是&#39; Person&#39;类),并将其设置为customObject的具有反射的Person字段?
答案 0 :(得分:1)
if (propertyType.IsClass)
{
propInfo.SetValue(contactToUpdate, ((JObject)field.Value).ToObject(propertyType), null);
}