2014-09-04 50 views
2

我想要做的是反序列化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#抱怨的數據類型的異常。我需要做些什麼才能使此代碼有效?我缺少什麼知識?

回答

2

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

0

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

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

但是,如果對象是同一類型的不是你有一個很難的類型區分,可能打運行時錯誤。

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