using Newtonsoft.Json.Linq;
using System.Collections.Generic;
static void Main(string[] args)
Console.WriteLine("Hello World!");
var o = new Employee{FirstName = "John", LastName = "Doe", Role = new Role{Name = "Foo", Priviledges = new[]{new Priviledge{Name = "Hoo"}}}};
string json = JsonConvert.SerializeObject(o, Formatting.Indented, new NestedJsonConverter(typeof(Employee)));
public class NestedJsonConverter : JsonConverter
private readonly Type[] _types;
public NestedJsonConverter(params Type[] types)
public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer)
JToken t = JToken.FromObject(value);
if (t.Type != JTokenType.Object)
writer.WriteStartObject();
void writeNested(JObject target, object source, string prefix)
target.Properties().ToList().ForEach(p =>
var prop = source.GetType().GetProperty(p.Name);
var value = prop.GetValue(source);
var prefixed = string.IsNullOrEmpty(prefix) ? p.Name : $"{prefix}_{p.Name}";
if (p.Value.Type == JTokenType.Object)
writeNested((JObject)p.Value, value, prefixed);
else if (p.Value.Type == JTokenType.Array)
var arr = (JArray)p.Value;
writer.WritePropertyName(prefixed);
writer.WritePropertyName(prefixed);
writer.WriteValue(value);
writeNested(o, value, "");
public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer)
throw new NotImplementedException("Unnecessary because CanRead is false. The type will skip the converter.");
public override bool CanRead
public override bool CanConvert(Type objectType)
return _types.Any(t => t == objectType);
public Priviledge[] Priviledges