using System.Text.RegularExpressions;
using System.Collections.Generic;
using Newtonsoft.Json.Linq;
public static void Main()
string serialized = JsonConvert.SerializeObject(new RootEntity {
Childs = new ChildEntity[] {
SecondChilds = new SecondChildEntity[] {
SecondChildProp = "SecondChildProp",
JObject jsonObject = (JObject)JsonConvert.DeserializeObject(serialized);
Console.WriteLine(jsonObject);
TemplateDef template = new TemplateDef {
Fields = new List<TemplateField> {
new TemplateField { Name = "RootProp2", Alias = "Alias" },
new TemplateField { Name = "Childs.ChildProp", Alias = "Alias2" },
new TemplateField { Name = "Childs.ChildProp2" },
new TemplateField { Name = "Childs.SecondChilds.SecondChildProp2", Alias = "Alias3" },
Iterate(jsonObject, template);
Console.WriteLine(jsonObject);
Console.WriteLine(jsonObject.SelectToken("Childs[0].ChildProp"));
public static void Iterate(JObject jsonObject, TemplateDef template)
foreach (JProperty jsonProp in jsonObject.Properties().ToList())
JToken val = jsonProp.Value;
case JTokenType.Object: Iterate((JObject)val, template); break;
case JTokenType.Array: Iterate((JArray)val, template); break;
default: HandleProperty(jsonObject, template, jsonProp); break;
public static void Iterate(JArray jsonArray, TemplateDef template)
foreach (JObject jsonObject in jsonArray.Children<JObject>().ToList())
Iterate(jsonObject, template);
public static void HandleProperty(JObject jsonObject, TemplateDef template, JProperty jsonProp) {
Console.WriteLine(string.Format("{0}, {1}", jsonProp, jsonProp.Path));
string propertyPath = Regex.Replace(jsonProp.Path, @"\[[0-9]*\]", "");
TemplateField field = template.Fields.FirstOrDefault(f => f.Name == propertyPath);
Console.WriteLine(string.Format("Remove {0}", jsonProp.Path));
jsonObject.Remove(jsonProp.Name);
} else if (!string.IsNullOrEmpty(field.Alias)) {
Console.WriteLine(string.Format("Alias {0}, {1}", jsonProp.Path, field.Alias));
jsonProp.Replace(new JProperty(field.Alias, jsonProp.Value));
public class RootEntity {
public string RootProp {get; set;}
public int RootProp2 {get; set;}
public ChildEntity[] Childs {get; set;}
public class ChildEntity {
public string ChildProp {get; set;}
public int ChildProp2 {get; set;}
public SecondChildEntity[] SecondChilds {get; set;}
public class SecondChildEntity {
public string SecondChildProp {get; set;}
public int SecondChildProp2 {get; set;}
public class TemplateDef {
public List<TemplateField> Fields {get; set;}
public class TemplateField {
public string Name {get; set;}
public string Alias {get; set;}