2012-07-12 108 views
10

我想用JSON.NET解析C#中的这段JSON,但我不知道该如何去解决。在不知道索引的情况下在C#中解析json

JSON:

{ 
    "success":true, 
    "rgInventory":{ 
     "967633758":{ 
      "id":"967633758", 
      "classid":"23973033", 
      "instanceid":"11040671", 
      "amount":"1", 
      "pos":1 
     }, 
     "302756826":{ 
      "id":"302756826", 
      "classid":"15", 
      "instanceid":"11041143", 
      "amount":"1", 
      "pos":2 
     },... 
    } 
} 

完整JSON:http://steamcommunity.com/id/jessecar/inventory/json/440/2/?trading=1

我需要得到每个“rgInventory”孩子的元素,但我不能让一个类,因为该项目名称是始终改变。

我试过使用这段代码,但我总是得到一个异常。

dynamic jsObject = JsonConvert.DeserializeObject(jsonString); 

Console.WriteLine("Status: "+jsObject["success"]); //This works fine 

foreach(var i in jsObject["rgInventory"]){ 
    Console.WriteLine("Item ID: "+i["id"]); //This gives an exception 
} 

例外:

未处理的异常:System.InvalidOperationException:无法访问Newtonsoft.Json.Linq.JProperty孩子值。

回答

12

这应该有效。

var jObj = (JObject)JsonConvert.DeserializeObject(json); 
foreach(var child in jObj["rgInventory"].Children()) 
{ 
    Console.WriteLine("Item ID: {0}", child.First()["id"]); 
} 

此外,使用dynamic关键字可以使你的代码更readible:

dynamic jObj = JsonConvert.DeserializeObject(json); 
Console.WriteLine("Status: " + jObj.success); 
foreach(var child in jObj.rgInventory.Children()) 
{ 
    Console.WriteLine("Item ID: {0}", child.First.id); 
} 
+1

完美工作,谢谢! – Jessecar 2012-07-12 08:00:55