使用Newtonsoft JSON.NET反序列化Dynamic Json字符串

Yaw*_*war 16 c# json facebook json.net facebook-graph-api

我有一个JSON字符串,我从Facebook API获得,其中我有一个节点,其名称根据其内容而变化,例如一段时间它是45,或58等.它可以是任何数字.我想要它的价值.怎么弄?例:

{
"data": [
{
  "id": "1492292372_10201810786059989", 
  "created_time": "2014-04-05T09:00:54+0000"
}, 
{
  "id": "1492292372_10201804679827337", 
  "created_time": "2014-04-04T07:29:07+0000"
}, 
{
  "id": "1492292372_10201804649306574", 
  "created_time": "2014-04-04T07:10:33+0000"
}, 
{
  "id": "1492292372_10201801316823264", 
  "created_time": "2014-04-03T18:31:50+0000"
}, 
{
  "id": "1492292372_10201798962284402", 
  "created_time": "2014-04-03T06:24:47+0000"
}, 
{
  "message_tags": {
    "0": [
      {
        "id": "1492292372", 
        "name": "Yawar Sohail", 
        "type": "user", 
        "offset": 0, 
        "length": 12
      }
    ], 
    "15": [
      {
        "id": "1489845168", 
        "name": "Zeeshan Anjum", 
        "type": "user", 
        "offset": 15, 
        "length": 13
      }
    ]
  }, 
  "id": "1492292372_10201796274777216", 
  "created_time": "2014-04-02T17:57:05+0000"
}, 
{
  "id": "1492292372_10201794080482360", 
  "created_time": "2014-04-02T07:26:23+0000"
}, 
Run Code Online (Sandbox Code Playgroud)

在message_tags里面有两个节点[0和15],它们根据它们的偏移值动态地改变.我想要这些节点中的名称,类型和ID.

aev*_*tas 29

您可以将JSON反序列化为ExpandoObject:

var converter = new ExpandoObjectConverter();
dynamic obj = JsonConvert.DeserializeObject<ExpandoObject>(json, converter);
Run Code Online (Sandbox Code Playgroud)

它在运行时动态地向您的对象添加成员,并允许您按照此答案中的描述迭代它们:

foreach (var prop in obj.GetType().GetProperties(BindingFlags.Instance | BindingFlags.Public))
{
   Console.WriteLine("Name: {0}, Value: {1}",prop.Name, prop.GetValue(obj,null));
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以迭代obj.message_tags以获取单个消息,并分别获取所有详细信息.

  • 在我的情况下,我甚至可以省略`converter`变量. (2认同)