Inu Kenshi Inu Kenshi - 1 year ago 70
C# Question

Looping through multiple JObject levels and gathering information as a string

I'm using the following code to gather Json data from a URL.

var json = new WebClient().DownloadString("http://steamcommunity.com/id/tryhardhusky/inventory/json/753/6");
JObject jo = JObject.Parse(json);
JObject ja = (JObject)jo["rgDescriptions"];

int cCount = 0;
int bCount = 0;
int eCount = 0;

foreach(var x in ja){

// I'm stuck here.
string type = (Object)x["type"];

}

CUAI.sendMessage("I found: " + ja.Count.ToString());


Everything is working well until I get to the foreach statement.

Here is a snippet of the JSON Data.

{
"success": true,
"rgInventory": {
"Blah other stuff"
},
"rgDescriptions": {
"637390365_0": {
"appid": "753",
"background_color": "",
"type": "0RBITALIS Trading Card"
"175240190_0": {
"appid": "753",
"background_color": "",
"type": "Awesomenauts Trading Card"
},
"195930139_0": {
"appid": "753",
"background_color": "",
"type": "CONSORTIUM Emoticon"
}
}
}


I'm wanting to loop through each item in rgDescriptions and get the
type
data as a string, Then check if it contains either
background
,
emoticon
or
trading card
.

I know I can use the
if(type.Contains("background"))
to check what the item type is, But I'm having trouble with the foreach loop.

If I use
foreach(JObject x in ja)
I get a
cannot convert type
Error.

If I use
foreach(Object x in ja)
It comes up with a
Cannot apply indexing of type object
.

This error also happens when I use
foreach(var x in ja)
and
string type = (JObject)x["type"];


Can anyone tell me what I'm doing wrong, Please?

Answer Source

You have some errors in your JSON. Check it with jsonlint.com. I think it should look something like this:

{
    "success": true,
    "rgInventory": {
        "Blah other stuff": ""
    },
    "rgDescriptions": {
        "637390365_0": {
            "appid": "753",
            "background_color": "",
            "type": "0RBITALIS Trading Card"
        },
        "175240190_0": {
            "appid": "753",
            "background_color": "",
            "type": "Awesomenauts Trading Card"
        },
        "195930139_0": {
            "appid": "753",
            "background_color": "",
            "type": "CONSORTIUM Emoticon"
        }
    }
}

You can use the JProperty, JToken and the SelectToken Method to get the type:

var json = new WebClient().DownloadString("http://steamcommunity.com/id/tryhardhusky/inventory/json/753/6");
JObject jo = JObject.Parse(json);

foreach (JProperty x in jo.SelectToken("rgDescriptions"))
{
    JToken type = x.Value.SelectToken("type");
    string typeStr = type.ToString().ToLower();

    if (typeStr.Contains("background"))
    {
        Console.WriteLine("Contains 'background'");
    }
    if (typeStr.Contains("emoticon"))
    {
        Console.WriteLine("Contains 'emoticon'");
    }
    if (typeStr.Contains("trading card"))
    {
        Console.WriteLine("Contains 'trading card'");
    }
}
Recommended from our users: Dynamic Network Monitoring from WhatsUp Gold from IPSwitch. Free Download