动态 JContainer (JSON.NET) & 在运行时迭代属性
Posted
技术标签:
【中文标题】动态 JContainer (JSON.NET) & 在运行时迭代属性【英文标题】:dynamic JContainer (JSON.NET) & Iterate over properties at runtime 【发布时间】: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
方法中做了什么。
【参考方案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<T>
所做的事情。
@Alex 我想反序列化为Dictionary<string, object>
也可能有帮助。查看编辑。以上是关于动态 JContainer (JSON.NET) & 在运行时迭代属性的主要内容,如果未能解决你的问题,请参考以下文章
使用 Json.net 将 JSON 对象反序列化为动态对象
使用Newtonsoft.Json.dll(JSON.NET)动态解析JSON.net 的json的序列化与反序列化
如何在 C# 中动态转换来自 Json.NET 的解析 JSON 结果?