Newtonsoft.Json - 动态对象属性访问

时间:2016-04-26 15:53:36

标签: c# json.net

我正在尝试浏览dynamic中包含的JArray对象的每个属性:

Newtonsoft.Json.Linq.JArray feeds = Newtonsoft.Json.Linq.JArray.Parse(response.Content);
if (feeds.Any())
{
    PropertyDescriptorCollection dynamicProperties = TypeDescriptor.GetProperties(feeds.First());
    foreach (dynamic feed in feeds)
    {
        object[] args = new object[dynamicProperties.Count];
        int i = 0;
        foreach (PropertyDescriptor prop in dynamicProperties)
        {
             args[i++] = feed.GetType().GetProperty(prop.Name).GetValue(feed, null);
        }
        yield return (T)Activator.CreateInstance(typeof(T), args);
    }
}

当我试图访问feed.GetType().GetProperty(prop.Name).GetValue(feed, null);时,它告诉我feed.GetType().GetProperty(prop.Name);为空。

JSON结构如下所示:

[
    {
        "digitalInput.field.channel":"tv",
        "digitalInput.field.comment":"archive",
        "count(digitalInput.field.comment)":130
    }
]

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:2)

尝试将您的foreach更改为

foreach (PropertyDescriptor prop in dynamicProperties)
{
    args[i++] = prop.GetValue(feed);
}

<强>更新

args[i++] = feed.GetType().GetProperty(prop.Name).GetValue(feed, null);

所以,让我们一步一步地看到它:

  • feed.GetType():将返回JArray
  • 类型
  • feed.GetType().GetProperty(prop.Name):问题出在这里,因为 你试图通过名字来获得类型JArray的属性,但是 在您的情况下,prop.Name将是“digitalInput.field.channel”“digitalInput.field.comment”“count(digitalInput.field。评论)“
    因此,在结果中它将返回null,因为类型JArray没有此类属性。