public static void Parse(StringBuilder stringBuilder, string name, dynamic o, int tab) { if (o is JsonToDynamic) { if (o.UnderlyingObject() is Dictionary<string, object>) { WriteName(stringBuilder, tab, name, "dynamic", null); var dictionary = o.UnderlyingObject() as Dictionary<string, object>; foreach (KeyValuePair<string, object> kvp in dictionary) { Parse(stringBuilder, kvp.Key, kvp.Value, tab); } } if (o.UnderlyingObject() is IEnumerable<dynamic>) { Parse(stringBuilder, name, o.UnderlyingObject(), tab - 1); } } else if (o is JObject) { var jObject = (o as JObject); WriteName(stringBuilder, tab + 1, name, "dynamic", null); foreach (var item in jObject) { Parse(stringBuilder, item.Key, item.Value, tab + 2); } } else if (o is JValue) { var meta = "null"; if (o.Value != null) { meta = o.Value.GetType().Name; } WriteName(stringBuilder, tab + 1, name, meta, o.Value); } else if (o is IEnumerable<dynamic>) { WriteName(stringBuilder, tab + 1, name, "IEnumerable<dynamic>", null); int index = 0; foreach (var r in o as IEnumerable<dynamic>) { Parse(stringBuilder, string.Format("[{0}]", index), r, tab + 2); index++; } } else if (o is JArray) { WriteName(stringBuilder, tab + 1, name, "IEnumerable<dynamic>", null); int index = 0; foreach (var r in o as JArray) { Parse(stringBuilder, string.Format("[{0}]", index), r, tab + 2); index++; } } else { if (o != null) { WriteName(stringBuilder, tab, name, o.GetType().Name, o); } } }