using System.Collections.Generic;
public static void Main()
var childLowest = new TemplateDataQueryElement
var childMiddle = new TemplateDataQueryElement
Children = new List<TemplateDataQueryElement>
childLowest.Parent = childMiddle;
var parent = new TemplateDataQueryElement
Children = new List<TemplateDataQueryElement>
childMiddle.Parent = parent;
var _jsonSettings = new JsonSerializerSettings()
TypeNameHandling = TypeNameHandling.Auto,
ConstructorHandling = ConstructorHandling.AllowNonPublicDefaultConstructor,
PreserveReferencesHandling = PreserveReferencesHandling.Objects,
ObjectCreationHandling = ObjectCreationHandling.Auto
var serializedStr = JsonConvert.SerializeObject(parent, Formatting.Indented, _jsonSettings);
Console.WriteLine("*************** Serialized JSON ***************************");
Console.WriteLine(serializedStr);
var deserializedStructure = JsonConvert.DeserializeObject<TemplateDataQueryElement>(serializedStr, _jsonSettings);
Console.WriteLine("*************** Deserialized Checks ***********************");
Console.WriteLine("Child Query: {0}, Parent Query: {1}", deserializedStructure.Children[0].Query, deserializedStructure.Children[0].Parent.Query);
Console.WriteLine("Child Query: {0}, Parent Query: {1}", deserializedStructure.Children[0].Children[0].Query, deserializedStructure.Children[0].Children[0].Parent.Query);
public class TemplateDataLinkedListBase<T> where T : TemplateDataLinkedListBase<T>
[JsonProperty(TypeNameHandling = TypeNameHandling.Objects)]
public T Parent { get; set; }
[JsonProperty(TypeNameHandling = TypeNameHandling.Objects)]
public List<T> Children { get; set; }
public class TemplateDataQueryElement : TemplateDataLinkedListBase<TemplateDataQueryElement>
public string Query { get; set; }
public TemplateDataQueryElement()
Children = new List<TemplateDataQueryElement>();