动态JContainer(JSON.NET)并在运行时迭代属性

Ale*_*lex 20 c# reflection dynamic json.net

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

 public dynamic Post(dynamic myobject)        
Run Code Online (Sandbox Code Playgroud)

JSON会自动解析,结果dynamic对象是Newtonsoft.Json.Linq.JContainer.我可以按照预期在运行时评估属性,因此如果JSON包含类似myobject.myproperty的内容,那么我现在可以获取接收的动态对象并myobject.myproperty在C#代码中调用.到现在为止还挺好.

现在我想迭代作为JSON的一部分提供的所有属性,包括嵌套属性.但是,如果我这样做myobject.GetType().GetProperties()只返回属性Newtonsoft.Json.Linq.JContainer而不是我正在寻找的属性(这是JSON的一部分).

知道怎么做吗?

L.B*_*L.B 45

我认为这可以作为一个起点

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

编辑

这也可以帮到你

var dict = JsonConvert.DeserializeObject<Dictionary<string, object>>(jObj.ToString());
Run Code Online (Sandbox Code Playgroud)

  • @Alex我想反序列化为`Dictionary <string,object>`也可能有帮助.看编辑. (2认同)
  • @Alex不应该标记为答案吗? (2认同)