2012-07-12 20 views
10

Chcę sparsować ten kawałek JSON w języku C# z JSON.NET, ale nie wiem jak to zrobić.Parsowanie json w C# bez znajomości indeksów

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 
     },... 
    } 
} 

Pełna Json: http://steamcommunity.com/id/jessecar/inventory/json/440/2/?trading=1

Muszę elementy każdego „rgInventory” dziecko, ale nie może mieć klasę dla niego, ponieważ nazwy pozycji są zawsze wymiana pieniędzy.

Próbowałem użyć tego fragmentu kodu, ale zawsze otrzymuję wyjątek.

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 
} 

Wyjątek:

Unhandled Wyjątek: System.InvalidOperationException: Nie można uzyskać dostępu wartość dziecięcej Newtonsoft.Json.Linq.JProperty.

Odpowiedz

12

To powinno zadziałać.

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

Dodatkowo, używając dynamic słowa kluczowego może uczynić kod bardziej 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

działało idealnie, dzięki! – Jessecar