将json动态反序列化为传入的任何对象。c#
我正在尝试将json反序列化为c#中的对象。我希望能够做的是,通过json.Net库将任何对象传递到它的类型,并将json反序列化到该特定对象中。下面是代码行将json动态反序列化为传入的任何对象。c#,c#,json,serialization,json.net,C#,Json,Serialization,Json.net,我正在尝试将json反序列化为c#中的对象。我希望能够做的是,通过json.Net库将任何对象传递到它的类型,并将json反序列化到该特定对象中。下面是代码行 Object someObject1 = someObject; string result = await content.ReadAsStringAsync(); return JsonConvert.DeserializeObject<someObject1.GetType()>(result); Object
Object someObject1 = someObject;
string result = await content.ReadAsStringAsync();
return JsonConvert.DeserializeObject<someObject1.GetType()>(result);
Object someObject1=someObject;
字符串结果=等待内容。ReadAsStringAsync();
返回JsonConvert.DeserializeObject(结果);
最后一行抛出一个异常
operator '<' cannot be applied to operands of type 'method group'
运算符'JsonConvert.DeserializeObject
需要编译时类型。您不能在运行时向它传递您想要传递的类型(与声明列表
没有什么不同)。您应该反序列化到一个通用json对象JObject
(或动态),或者创建一个对象实例并用json填充它
您可以使用静态方法PopulateObject
(当然,如果对象的属性与要反序列化的json匹配)
您可以忽略泛型方法并使用动态:
var myObj = (dynamic)JsonConvert.DeserializeObject(result);
但是,如果对象不是同一类型,则很难区分这些类型,并且可能会出现运行时错误。这是在给定JSON数据的情况下填充对象字段的最佳方法
此代码作为方法属于对象本身
public void PopulateFields(string jsonData)
{
var jsonGraph = JObject.Parse(jsonData);
foreach (var prop in this.GetType().GetProperties())
{
try
{
prop.SetValue(this, fields[prop.Name].ToObject(prop.PropertyType), null);
}
catch (Exception e)
{
// deal with the fact that the given
// json does not contain that property
}
}
对于遇到此问题的任何人,Newtonsoft JSON的较新版本都有一个重载,该重载将类型作为第二个参数,您可以通过该重载传递动态值,而无需跳转:
var myObj = JsonConvert.DeserializeObject(string serializedObject, Type deserializedType);
所以如果我传入一个对象someObject,但是someObject的类型是SomeOtherObjectMake,那么它将填充SomeOtherObjectMake的字段,对吗?是的,我刚刚测试过这个。
var myObj = JsonConvert.DeserializeObject(string serializedObject, Type deserializedType);