C# 动态JContainer(JSON.NET)&;在运行时迭代属性

C# 动态JContainer(JSON.NET)&;在运行时迭代属性,c#,dynamic,reflection,json.net,C#,Dynamic,Reflection,Json.net,我在MVC4/.NET4 WebApi控制器操作中收到一个JSON字符串。动作的参数是dynamic,因为我对接收端接收的JSON对象一无所知 public dynamic Post(dynamic myobject) JSON被自动解析,生成的dynamic对象是Newtonsoft.JSON.Linq.JContainer。正如预期的那样,我可以在运行时计算属性,因此如果JSON包含类似myobject.myproperty的内容,那么我现在可以获取接收到的动态对象,并在

我在MVC4/.NET4 WebApi控制器操作中收到一个JSON字符串。动作的参数是
dynamic
,因为我对接收端接收的JSON对象一无所知

 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的一部分)


你知道怎么做吗?

我想这可以作为一个起点

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());
var dict=JsonConvert.DeserializeObject(jObj.ToString());

文章可能会帮助您,检查一下他在
反序列化请求
方法中做了什么。@Alex然后事情变得越来越复杂,您可能需要编写递归函数。你应该经常检查JObject、JArray、JProperty等,基本上你应该重复
JsonConvert.DeserializeObject
所做的事情。@Alex我想反序列化到
字典
也会有帮助。请参见编辑。