将json动态反序列化为传入的任何对象。c#

将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

我正在尝试将json反序列化为c#中的对象。我希望能够做的是,通过json.Net库将任何对象传递到它的类型,并将json反序列化到该特定对象中。下面是代码行

 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);