Iterating over JSON object in C#
C#JsonC# 4.0json.netC# 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";
}