public static void Main()
Address = new { Home = "No. 123, Oak Street", Email = "john@mail.com" },
Extra = new { Serials = new[] { 20, 30, 40, 50 } }
Address = new { Home = "No. 321, Cliff Road", Email = "jean@mail.com" },
Extra = new { Serials = new[] { 25, 35, 45, 55 } }
Console.WriteLine("--- Full indenting ---");
Console.WriteLine(SerializeWithCustomIndenting(items));
Console.WriteLine("--- 3 levels of indenting ---");
Console.WriteLine(SerializeWithCustomIndenting(items, 3));
Console.WriteLine("--- 2 levels of indenting ---");
Console.WriteLine(SerializeWithCustomIndenting(items, 2));
Console.WriteLine("--- 1 level of indenting ---");
Console.WriteLine(SerializeWithCustomIndenting(items, 1));
Console.WriteLine("--- No indenting ---");
Console.WriteLine(SerializeWithCustomIndenting(items, 0));
public static string SerializeWithCustomIndenting(object obj, int? maxIdentDepth = null)
using (StringWriter sw = new StringWriter())
using (CustomIndentingJsonTextWriter jw = new CustomIndentingJsonTextWriter(sw))
jw.MaxIndentDepth = maxIdentDepth;
JsonSerializer ser = new JsonSerializer();
public class CustomIndentingJsonTextWriter : JsonTextWriter
public int? MaxIndentDepth { get; set; }
public CustomIndentingJsonTextWriter(TextWriter writer) : base(writer)
Formatting = Formatting.Indented;
public override void WriteStartArray()
if (MaxIndentDepth.HasValue && Top > MaxIndentDepth.Value)
Formatting = Formatting.None;
public override void WriteStartObject()
if (MaxIndentDepth.HasValue && Top > MaxIndentDepth.Value)
Formatting = Formatting.None;
public override void WriteEndArray()
if (MaxIndentDepth.HasValue && Top <= MaxIndentDepth.Value)
Formatting = Formatting.Indented;
public override void WriteEndObject()
if (MaxIndentDepth.HasValue && Top <= MaxIndentDepth.Value)
Formatting = Formatting.Indented;