动态反序列化JSON到传入的任何对象。c#

问题描述:

我想要做的是反序列化JSON到一个对象在C#中。我希望能够做的是通过任何对象获取它的类型,并使用JSON.Net库将json反序列化为该特定对象。这里是代码行。动态反序列化JSON到传入的任何对象。c#

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

最后一行抛出的

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

我如何在<>无C#抱怨的数据类型的异常。我需要做些什么才能使此代码有效?我缺少什么知识?

JsonConvert.DeserializeObject<T>需要编译时类型。您不能像运行时那样将其传递给类型(与声明List<T>没什么区别)。你应该反序列化到一个通用的json对象JObject(或dynamic),或者你应该创建一个对象的实例并用json填充它。

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

JsonConvert.PopulateObject(result, someObject1); 
+0

因此,如果我传入一个Object someObject,但someObject输入someOtherObjectIMade,那么它会填充someOtherObjectIMade的字段是否正确? – 2014-09-04 18:30:07

+1

它我只是测试了这一点。 – 2014-09-04 18:48:17

可以忽略通用的方法和使用dynamic

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 
     } 
}