using System.Text.RegularExpressions;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
""guid"": ""00000000-0000-0000-0000-000000000000"",
""number"": ""1234567890"",
""date"": ""2015-09-08T00:00:00"",
""guid"": ""00000000-0000-0000-0000-000000000000"",
""name"": ""Installer 1"",
""address1"": ""qwerty"",
""address2"": ""qwerty"",
""postcode"": ""asdfghj"",
""installationstatus"": {
""installationstatusid"": 4,
""installationstatus"": ""FAIL""
""installationstatus"": {
""installationstatusid"": 1,
""installationstatus"": ""NEW""
var dict = JsonHelper.DeserializeAndFlatten(json);
foreach (var kvp in dict)
int i = kvp.Key.LastIndexOf(".");
string key = (i > -1 ? kvp.Key.Substring(i + 1) : kvp.Key);
Match m = Regex.Match(kvp.Key, @"\.([0-9]+)\.");
if (m.Success) key += m.Groups[1].Value;
Console.WriteLine(key + ": " + kvp.Value);
public static class JsonHelper
public static Dictionary<string, object> DeserializeAndFlatten(string json)
Dictionary<string, object> dict = new Dictionary<string, object>();
JToken token = JToken.Parse(json);
FillDictionaryFromJToken(dict, token, "");
private static void FillDictionaryFromJToken(Dictionary<string, object> dict, JToken token, string prefix)
foreach (JProperty prop in token.Children<JProperty>())
FillDictionaryFromJToken(dict, prop.Value, Join(prefix, prop.Name));
foreach (JToken value in token.Children())
FillDictionaryFromJToken(dict, value, Join(prefix, index.ToString()));
dict.Add(prefix, ((JValue)token).Value);
private static string Join(string prefix, string name)
return (string.IsNullOrEmpty(prefix) ? name : prefix + "." + name);