using System.Collections.Generic;
using Newtonsoft.Json.Serialization;
public static void Main()
Dictionary<string, Tuple<string,string>> RenameRules = new Dictionary<string, Tuple<string,string>>();
RenameRules.Add("Sigma", new Tuple<string, string>("Id", "TestCase"));
var items = new List<ItemDTO>
new ItemDTO { Id = 1, Name = "Hammer" },
new ItemDTO { Id = 2, Name = "Saw" },
new ItemDTO { Id = 3, Name = "Drill" },
new ItemDTO { Id = 4, Name = "Wrench" },
var users = new List<UserDTO>
new UserDTO { Id = 1, Name = "Joe Schmoe", InnerClass = items[0]},
new UserDTO { Id = 2, Name = "John Doe", InnerClass = items[1]},
new UserDTO { Id = 3, Name = "Bob Smith", InnerClass = items[2]}
PagedData<UserDTO> data1 = new PagedData<UserDTO>(users, 3, 1, 0, 10);
JsonSerializerSettings settings = new JsonSerializerSettings
ContractResolver = new CustomResolver(RenameRules.Where(el => el.Key == flag).Select(el=> el.Value).ToList()),
Formatting = Formatting.Indented
string json = JsonConvert.SerializeObject(data1, settings);
Console.WriteLine(new string('-', 40));
public class JsonPropertyNameBasedOnItemClassAttribute : Attribute
public class JsonRenameNameAttribute : Attribute
public string Renamed {get; set;}
public JsonRenameNameAttribute(string newName)
public class JsonPluralNameAttribute : Attribute
public string PluralName { get; set; }
public JsonPluralNameAttribute(string pluralName)
public class CustomResolver : DefaultContractResolver
List<Tuple<string,string>> _renameRules;
public CustomResolver(IEnumerable<Tuple<string,string>> renameRules)
_renameRules = renameRules.ToList();
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
JsonProperty prop = base.CreateProperty(member, memberSerialization);
if (member.GetCustomAttribute<JsonRenameNameAttribute>() != null && _renameRules.Any(el => el.Item1 == prop.PropertyName))
prop.PropertyName = (_renameRules.FirstOrDefault(el => el.Item1 == prop.PropertyName).Item2);
public class PagedData<T>
public PagedData(IEnumerable<T> data, int count, int currentPage, int offset, int rowsPerPage, int? previousPage = null, int? nextPage = null)
CurrentPage = currentPage;
RowsPerPage = rowsPerPage;
PreviousPage = previousPage;
[JsonPropertyNameBasedOnItemClass]
public IEnumerable<T> Data { get; private set; }
public int Count { get; private set; }
public int CurrentPage { get; private set; }
public int Offset { get; private set; }
public int RowsPerPage { get; private set; }
public int? PreviousPage { get; private set; }
public int? NextPage { get; private set; }
[JsonRenameNameAttribute("Mutable")]
public int Id { get; set; }
public string Name { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public ItemDTO InnerClass{get;set;}
public string Name { get; set; }