2012-11-30 23 views
17

我正在接收MVC4/.NET4 WebApi控制器操作中的JSON字符串。該動作的參數是dynamic,因爲我不知道接收端有關我收到的JSON對象的任何信息。動態JContainer(JSON.NET)&在運行時迭代屬性

public dynamic Post(dynamic myobject)   

的JSON被自動解析和所得dynamic對象是Newtonsoft.Json.Linq.JContainer。我可以像預期的那樣在運行時評估屬性,因此如果JSON包含類似myobject.myproperty的東西,那麼我現在可以接收動態對象並在C#代碼中調用myobject.myproperty。到現在爲止還挺好。

現在我想遍歷作爲JSON的一部分提供的所有屬性,包括嵌套屬性。但是,如果我執行myobject.GetType().GetProperties(),它只會返回屬性Newtonsoft.Json.Linq.JContainer而不是我正在查找的屬性(即JSON的一部分)。

任何想法如何做到這一點?

+0

[這](http://code.msdn.microsoft .com/Supporting-different-data-b0351c9a)文章可能會幫助你,看看他在'DeserializeRequest'方法中做了什麼。 –

回答

38

我覺得這可能是一個起點

dynamic dynObj = JsonConvert.DeserializeObject("{a:1,b:2}"); 

//JContainer is the base class 
var jObj = (JObject)dynObj; 

foreach (JToken token in jObj.Children()) 
{ 
    if (token is JProperty) 
    { 
     var prop = token as JProperty; 
     Console.WriteLine("{0}={1}", prop.Name, prop.Value); 
    } 
} 

編輯

這也可以幫助你

var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jObj.ToString()); 
+0

謝謝!如果JSON嵌套,這將如何工作? – Alex

+1

@Alex然後事情變得越來越複雜,你可能不得不寫一個遞歸函數。你應該總是檢查JObject,JArray,JProperty等,基本上你應該重複'JsonConvert.DeserializeObject'做什麼。 –

+2

@Alex我想反序列化到一個'Dictionary '也可能有幫助。查看編輯。 –