using System.Collections;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
Person angela = new Person
Person charles = new Person
Person david = new Person
Node<Person> root = new Node<Person>(angela);
Node<Person> sub = root.Add(bob);
var settings = new JsonSerializerSettings
Converters = new List<JsonConverter> { new OrgChartConverter() },
Formatting = Formatting.Indented
string json = JsonConvert.SerializeObject(root, settings);
public class OrgChartConverter : JsonConverter
public override bool CanConvert(Type objectType)
return (objectType == typeof(Node<Person>));
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
Node<Person> node = (Node<Person>)value;
JObject obj = new JObject();
obj.Add("Name", node.Value.Name);
obj.Add("Subordinates", JArray.FromObject(node.Children, serializer));
public override bool CanRead
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException();
public string Name { get; set; }
public string Title { get; set; }
public class Node<T> : IEnumerable<Node<T>>
public T Value { get; set; }
public List<Node<T>> Children { get; private set; }
Children = new List<Node<T>>();
public Node<T> Add(T value)
var childNode = new Node<T>(value);
public IEnumerator<Node<T>> GetEnumerator()
return Children.GetEnumerator();
IEnumerator IEnumerable.GetEnumerator()