Iterating over JSON object in C#

C#JsonC# 4.0json.net

C# Problem Overview


I am using JSON.NET in C# to parse a response from the Klout API. My response is like this:

[  {    "id": "5241585099662481339",    "displayName": "Music",    "name": "music",    "slug": "music",    "imageUrl": "http://kcdn3.klout.com/static/images/music-1333561300502.png"  },  {    "id": "6953585193220490118",    "displayName": "Celebrities",    "name": "celebrities",    "slug": "celebrities",    "imageUrl": "http://kcdn3.klout.com/static/images/topics/celebrities_b32741b6703151cc7bd85fba24c44c52.png"  },  {    "id": "5757029936226020304",    "displayName": "Entertainment",    "name": "entertainment",    "slug": "entertainment",    "imageUrl": "http://kcdn3.klout.com/static/images/topics/Entertainment_7002e5d2316e85a2ff004fafa017ff44.png"  },  {    "id": "3718",    "displayName": "Saturday Night Live",    "name": "saturday night live",    "slug": "saturday-night-live",    "imageUrl": "http://kcdn3.klout.com/static/images/icons/generic-topic.png"  },  {    "id": "8113008320053776960",    "displayName": "Hollywood",    "name": "hollywood",    "slug": "hollywood",    "imageUrl": "http://kcdn3.klout.com/static/images/topics/hollywood_9eccd1f7f83f067cb9aa2b491cd461f3.png"  }]

As you see, it contains 5 id tags. Maybe next time it would be 6 or 1 or some other number. I want to iterate over the JSON and get the value of each id tag. I can't run a loop without knowing how many there will be. How can I solve this?

C# Solutions


Solution 1 - C#

dynamic dynJson = JsonConvert.DeserializeObject(json);
foreach (var item in dynJson)
{
    Console.WriteLine("{0} {1} {2} {3}\n", item.id, item.displayName, 
        item.slug, item.imageUrl);
}

or

var list = JsonConvert.DeserializeObject<List<MyItem>>(json);

public class MyItem
{
    public string id;
    public string displayName;
    public string name;
    public string slug;
    public string imageUrl;
}

Solution 2 - C#

You can use the JsonTextReader to read the JSON and iterate over the tokens:

using (var reader = new JsonTextReader(new StringReader(jsonText)))
{
    while (reader.Read())
    {
        Console.WriteLine("{0} - {1} - {2}", 
                          reader.TokenType, reader.ValueType, reader.Value);
    }
}

Solution 3 - C#

This worked for me, converts to nested JSON to easy to read YAML

    string JSONDeserialized {get; set;}
    public int indentLevel;

    private bool JSONDictionarytoYAML(Dictionary<string, object> dict)
    {
        bool bSuccess = false;
        indentLevel++;

        foreach (string strKey in dict.Keys)
        {
            string strOutput = "".PadLeft(indentLevel * 3) + strKey + ":";
            JSONDeserialized+="\r\n" + strOutput;

            object o = dict[strKey];
            if (o is Dictionary<string, object>)
            {
                JSONDictionarytoYAML((Dictionary<string, object>)o);
            }
            else if (o is ArrayList)
            {
                foreach (object oChild in ((ArrayList)o))
                {
                    if (oChild is string)
                    {
                        strOutput = ((string)oChild);
                        JSONDeserialized += strOutput + ",";
                    }
                    else if (oChild is Dictionary<string, object>)
                    {
                        JSONDictionarytoYAML((Dictionary<string, object>)oChild);
                        JSONDeserialized += "\r\n";  
                    }
                }
            }
            else
            {
                strOutput = o.ToString();
                JSONDeserialized += strOutput;
            }
        }

        indentLevel--;

        return bSuccess;

    }

usage

        Dictionary<string, object> JSONDic = new Dictionary<string, object>();
        JavaScriptSerializer js = new JavaScriptSerializer();
        
          try {

            JSONDic = js.Deserialize<Dictionary<string, object>>(inString);
            JSONDeserialized = "";
            
            indentLevel = 0;
            DisplayDictionary(JSONDic); 

            return JSONDeserialized;
        
        }
        catch (Exception)
        {
            return "Could not parse input JSON string";
        }
        

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionrequire_onceView Question on Stackoverflow
Solution 1 - C#L.BView Answer on Stackoverflow
Solution 2 - C#reticentView Answer on Stackoverflow
Solution 3 - C#MarkusView Answer on Stackoverflow