You can implement this yourself using a custom contract resolver. Suppose you have an attribute:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)] public class JsonViewAttribute : Attribute { public JsonViewAttribute(string viewName) { ViewName = viewName; } public string ViewName { get; } }
Views:
public static class JsonViews { public const string Administrator = "Administrator"; }
And the DTO class:
public class UserDto { public int ID { get; set; } public String Name { get; set; } [JsonView(JsonViews.Administrator)] public DateTime DateOfBirth { get; set; } [JsonView(JsonViews.Administrator)] public string Email { get; set; } }
And your goal is to serialize properties decorated with JsonView only if the current user is authenticated and has the target role ("Administrator"). Then you can create a contract converter as follows:
public class JsonViewContractResolver : JsonContractResolver { public JsonViewContractResolver(MediaTypeFormatter formatter) : base(formatter) { } protected override JsonProperty CreateProperty(MemberInfo member, MemberSerialization memberSerialization) { JsonProperty property = base.CreateProperty(member, memberSerialization); var viewAttr = member.GetCustomAttribute<JsonViewAttribute>(); if (viewAttr != null) {
And set it to config:
public static void Register(HttpConfiguration config) { config.MapHttpAttributeRoutes(); config.Formatters.JsonFormatter.SerializerSettings.ContractResolver = new JsonViewContractResolver(config.Formatters.JsonFormatter); }
Now when you return json in the controller as follows:
[System.Web.Http.HttpGet] public UserDto Get() { return new UserDto() { ID = 1, DateOfBirth = DateTime.UtcNow, Email = "test", Name = "name" }; }
And it is serialized in the json-admin properties, which will be omitted if the user is not an administrator.
Please note that if you do this:
[System.Web.Http.HttpGet] public IHttpActionResult Get() { return Json(new UserDto() { ID = 1, DateOfBirth = DateTime.UtcNow, Email = "test", Name = "name" }); }
Formatter is not used, and you yourself must pass serialization parameters using custom formatting (of course, you need to make it a reusable method, for example, declare the Json method in your base controller from which everyone else inherits):
return Json(new UserDto() { ID = 1, DateOfBirth = DateTime.UtcNow, Email = "test", Name = "name" }, GlobalConfiguration.Configuration.Formatters.JsonFormatter.SerializerSettings);
Using roles is just an example showing how, by default, you can extend the JSON.NET serializer used by asp.net api to achieve the desired result.