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

时间:2014-09-04 18:12:21

标签: c# json serialization json.net

我试图将json反序列化为c#中的对象。我希望能够做的是传递任何对象获取它的类型,并使用JSON.Net库将json反序列化为该特定对象。这是代码行。

 Object someObject1 = someObject;
 string result = await content.ReadAsStringAsync();
 return JsonConvert.DeserializeObject<someObject1.GetType()>(result);

最后一行抛出

的例外
 operator '<' cannot be applied to operands of type 'method group'

如何在&lt;&gt;中获取数据类型没有c#抱怨。我该怎么做才能使这段代码有效?我缺少什么知识?

4 个答案:

答案 0 :(得分:3)

JsonConvert.DeserializeObject<T>需要编译时类型。你不能在运行时传递一个类型,因为你想要做的事情(没有什么不同于声明List<T>)。您应该反序列化为通用的json对象JObject(或 dynamic ),或者您应该创建一个对象的实例并用json填充它。

您可以使用静态方法PopulateObject(当然,如果对象的属性匹配您要反序列化的json)。

JsonConvert.PopulateObject(result, someObject1 );

答案 1 :(得分:1)

您可以忽略通用方法并使用dynamic

var myObj = (dynamic)JsonConvert.DeserializeObject(result);

但是,如果对象的类型不同,则很难区分类型,可能会遇到运行时错误。

答案 2 :(得分:1)

对于遇到此问题的任何人,较新版本的Newtonsoft JSON都有一个重载,该重载将类型作为第二个参数,并且您可以在其中传递动态值而不会遇到任何麻烦:

var myObj = JsonConvert.DeserializeObject(string serializedObject, Type deserializedType);

答案 3 :(得分:0)

这是给定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
        }
}