【问题标题】:dynamic JContainer (JSON.NET) & Iterate over properties at runtime动态 JContainer (JSON.NET) & 在运行时迭代属性
【发布时间】:2012-11-19 03:10:21
【问题描述】:

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

知道怎么做吗?

【问题讨论】:

  • this 文章可能对你有所帮助,看看他在DeserializeRequest 方法中做了什么。

标签: c# dynamic reflection json.net


【解决方案1】:

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

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());

【讨论】:

  • @Alex 然后事情变得复杂了,你可能不得不编写一个递归函数。您应该始终检查 JObject、JArray、JProperty 等,基本上您应该重复 JsonConvert.DeserializeObject&lt;T&gt; 所做的事情。
  • @Alex 我想反序列化为Dictionary&lt;string, object&gt; 也可能有帮助。查看编辑。
猜你喜欢
  • 2017-04-22
  • 2013-03-27
  • 2013-06-29
  • 2010-10-30
  • 2012-11-18
  • 2011-03-24
  • 1970-01-01
  • 2016-06-18
  • 2018-04-11
相关资源
最近更新 更多