using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
""description"": ""Example JSON"",
""stageInfo1"": ""some info"",
""stageInfo2"": ""more info"",
""stageInfo1"": ""info here"",
""stageInfo2"": ""info there"",
""ID"": ""5a4d7de4c6518"",
RootObject obj = JsonConvert.DeserializeObject<RootObject>(json);
foreach (var kvp in obj.stages)
Console.WriteLine("---" + kvp.Key + "---");
var definition = stage.integration.definition;
if (definition.Count > 0)
foreach (var def in definition.Values)
Console.WriteLine("ID: " + def.ID);
Console.WriteLine("Name: " + def.Name);
Console.WriteLine("Editable: " + def.Editable);
Console.WriteLine("(empty dictionary)");
public string name { get; set; }
public string description { get; set; }
public Dictionary<string, string> properties { get; set; }
public Dictionary<string, Stage> stages { get; set; }
public string stageInfo1 { get; set; }
public string stageInfo2 { get; set; }
public Integration integration { get; set; }
public string x { get; set; }
public string y { get; set; }
public string z { get; set; }
[JsonConverter(typeof(TolerantObjectConverter<Dictionary<string, Definition>>))]
public Dictionary<string, Definition> definition { get; set; }
public bool Editable { get; set; }
public string ID { get; set; }
public string Name { get; set; }
class TolerantObjectConverter<T> : JsonConverter where T: new()
public override bool CanConvert(Type objectType)
return objectType == typeof(T);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JToken token = JToken.Load(reader);
if (token.Type == JTokenType.Object)
serializer.Populate(token.CreateReader(), result);
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();