using System.Collections.Generic;
using Newtonsoft.Json.Linq;
private static readonly string json = @"
""unflattenIncorrectWhenNestedFieldWithSpace"": {
""http"": { ""commandName"": ""Project"" },
""https"": { ""commandName"": ""Project"" },
""IIS Express"": { ""commandName"": ""IISExpress"" }
""IIS Express"": { ""commandName"": ""IISExpress"" }
public static void Main()
JObject jObj = JObject.Parse(json);
var flattened = jObj.Flatten();
WriteLine("Flattened JObject:\r\n" + ToDebugString(flattened));
JObject unflattened = flattened.Unflatten();
WriteLine("Unflattened JObject:\r\n" + ToDebugString(unflattened));
WriteLine("JObject is equal to unflattened dictionary: " + JToken.DeepEquals(jObj, unflattened));
var flattenedWithoutEmpty = jObj.Flatten(includeNullAndEmptyValues: false);
WriteLine("Flattened JObject without empty properties:\r\n" + ToDebugString(flattenedWithoutEmpty));
WriteLine("Unflattened JObject without empty properties:\r\n" + flattenedWithoutEmpty.Unflatten().ToString());
public static Action<object> WriteLine = (msg) => Console.WriteLine("\r\n" + msg.ToString() + "\r\n");
public static string ToDebugString<TKey, TValue>(IDictionary<TKey, TValue> dictionary)
return "{\r\n\t" + string.Join(",\r\n\t", dictionary.Select(kv => kv.Key + " = " + kv.Value).ToArray()) + "\r\n}";