using System.Collections.Generic;
using Newtonsoft.Json.Serialization;
public static void Main()
PagedData<User> page = new PagedData<User>
new User { Id = 1, Name = "Joe Schmoe" },
new User { Id = 2, Name = "John Doe" },
new User { Id = 3, Name = "Bob Smith" }
JsonSerializerSettings settings = new JsonSerializerSettings
ContractResolver = new CustomResolver(),
Formatting = Formatting.Indented
string json = JsonConvert.SerializeObject(page, settings);
PagedData<Berry> page2 = new PagedData<Berry>
new Berry { Id = 1, Name = "Strawberry" },
new Berry { Id = 2, Name = "Blueberry" },
new Berry { Id = 3, Name = "Blackberry" },
new Berry { Id = 4, Name = "Raspberry" },
new Berry { Id = 5, Name = "Boysenberry" }
json = JsonConvert.SerializeObject(page2, settings);
public class JsonNameBasedOnItemClassNameAttribute : Attribute {}
public class CustomResolver : DefaultContractResolver
protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization)
JsonProperty prop = base.CreateProperty(member, memberSerialization);
if (prop.PropertyType.IsGenericType && member.GetCustomAttribute<JsonNameBasedOnItemClassNameAttribute>() != null)
prop.PropertyName = Pluralize(prop.PropertyType.GetGenericArguments().First().Name);
protected string Pluralize(string name)
if (name.EndsWith("y") && !name.EndsWith("ay") && !name.EndsWith("ey") && !name.EndsWith("oy") && !name.EndsWith("uy"))
return name.Substring(0, name.Length - 1) + "ies";
public class PagedData<T>
[JsonNameBasedOnItemClassName]
public IEnumerable<T> Data { get; set; }
public int Count { get; set; }
public int CurrentPage { get; set; }
public int Offset { get; set; }
public int RowsPerPage { get; set; }
public int? PreviousPage { get; set; }
public int? NextPage { get; set; }
public int Id { get; set; }
public string Name { get; set; }
public int Id { get; set; }
public string Name { get; set; }