在不知道索引的情况下在C#中解析json

Jes*_*car 10 .net c# mono json json.net

我想用JSON.NET在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
      },...
   }
}
Run Code Online (Sandbox Code Playgroud)

全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
}
Run Code Online (Sandbox Code Playgroud)

例外:

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

L.B*_*L.B 12

这应该工作.

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

此外,使用dynamic关键字可以使您的代码更易读:

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);
}
Run Code Online (Sandbox Code Playgroud)