I've added upon the code submitted by jSnake04 and Dasun herein. I've added code to create lists of objects from JArray
instances. It has two-way recursion but as it is functioning on a fixed, finite tree model, there is no risk of stack overflow unless the data is massive.
/// <summary>/// Deserialize the given JSON string data (<paramref name="data"/>) into a/// dictionary./// </summary>/// <param name="data">JSON string.</param>/// <returns>Deserialized dictionary.</returns>private IDictionary<string, object> DeserializeData(string data){ var values = JsonConvert.DeserializeObject<Dictionary<string, object>>(data); return DeserializeData(values);}/// <summary>/// Deserialize the given JSON object (<paramref name="data"/>) into a dictionary./// </summary>/// <param name="data">JSON object.</param>/// <returns>Deserialized dictionary.</returns>private IDictionary<string, object> DeserializeData(JObject data){ var dict = data.ToObject<Dictionary<String, Object>>(); return DeserializeData(dict);}/// <summary>/// Deserialize any elements of the given data dictionary (<paramref name="data"/>) /// that are JSON object or JSON arrays into dictionaries or lists respectively./// </summary>/// <param name="data">Data dictionary.</param>/// <returns>Deserialized dictionary.</returns>private IDictionary<string, object> DeserializeData(IDictionary<string, object> data){ foreach (var key in data.Keys.ToArray()) { var value = data[key]; if (value is JObject) data[key] = DeserializeData(value as JObject); if (value is JArray) data[key] = DeserializeData(value as JArray); } return data;}/// <summary>/// Deserialize the given JSON array (<paramref name="data"/>) into a list./// </summary>/// <param name="data">Data dictionary.</param>/// <returns>Deserialized list.</returns>private IList<Object> DeserializeData(JArray data){ var list = data.ToObject<List<Object>>(); for (int i = 0; i < list.Count; i++) { var value = list[i]; if (value is JObject) list[i] = DeserializeData(value as JObject); if (value is JArray) list[i] = DeserializeData(value as JArray); } return list;}