using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
var root = JsonConvert.DeserializeObject<RootObject>(json);
foreach (var item in root.Items)
Console.WriteLine("EmployeeId: " + item.EmployeeId);
Console.WriteLine("EmployeeName: " + item.EmployeeName);
Console.WriteLine("CurrentAllocation: " + item.CurrentAllocation);
Console.WriteLine("DepartmentHead: " + item.DepartmentHead);
Console.WriteLine("Manager: " + item.Manager);
Console.WriteLine("Department: " + item.Department);
Console.WriteLine("Duration: " + item.Duration);
Console.WriteLine("Encounters: ");
foreach (var encounter in item.EncounterData.Encounters)
Console.WriteLine(" StartTimestamp: " + encounter.StartTimestamp);
Console.WriteLine(" Duration: " + encounter.Duration);
[JsonProperty("data", ItemConverterType = typeof(ArrayToObjectConverter<Item>))]
public List<Item> Items { get; set; }
public int EmployeeId { get; set; }
public string EmployeeName { get; set; }
public string CurrentAllocation { get; set; }
public int DepartmentHead { get; set; }
public string Manager { get; set; }
public string Department { get; set; }
public double Duration { get; set; }
public EncounterData EncounterData { get; set; }
public class EncounterData
[JsonProperty("data", ItemConverterType = typeof(ArrayToObjectConverter<Encounter>))]
public List<Encounter> Encounters { get; set; }
public double StartTimestamp { get; set; }
public double Duration { get; set; }
public class JsonArrayIndexAttribute : Attribute
public int Index { get; private set; }
public JsonArrayIndexAttribute(int index)
public class ArrayToObjectConverter<T> : JsonConverter where T : class, new()
public override bool CanConvert(Type objectType)
return objectType == typeof(T);
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
JArray array = JArray.Load(reader);
var propsByIndex = typeof(T).GetProperties()
.Where(p => p.CanRead && p.CanWrite && p.GetCustomAttribute<JsonArrayIndexAttribute>() != null)
.ToDictionary(p => p.GetCustomAttribute<JsonArrayIndexAttribute>().Index);
JObject obj = new JObject(array
return propsByIndex.TryGetValue(i, out prop) ? new JProperty(prop.Name, jt) : null;
serializer.Populate(obj.CreateReader(), target);
public override bool CanWrite
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
throw new NotImplementedException();