Java ASP.NET Web API中是否有@JsonView等效项
我在Spring和Java方面有更多的经验,但现在我正在从事ASP.NETWebAPI项目 因此,在Spring中有@JsonView注释,我可以用它注释我的DTO,所以我可以选择通过REST显示哪些数据。我觉得这很有用。但是我在ASP.NET中找不到任何等效的。所以我需要为每个特殊用例创建DTO 例如,在Java中,如果我有包含用户信息的UserEntity。有些信息可以公开查看,有些信息只能由管理员查看。siple解决方案可能是这样的Java ASP.NET Web API中是否有@JsonView等效项,java,c#,asp.net,spring,Java,C#,Asp.net,Spring,我在Spring和Java方面有更多的经验,但现在我正在从事ASP.NETWebAPI项目 因此,在Spring中有@JsonView注释,我可以用它注释我的DTO,所以我可以选择通过REST显示哪些数据。我觉得这很有用。但是我在ASP.NET中找不到任何等效的。所以我需要为每个特殊用例创建DTO 例如,在Java中,如果我有包含用户信息的UserEntity。有些信息可以公开查看,有些信息只能由管理员查看。siple解决方案可能是这样的 public class UserEntity {
public class UserEntity {
@JsonView(Views.Public.class)
@JsonProperty("ID")
private Integer id;
@JsonView(Views.Public.class)
private String name;
@JsonView(Views.Admin.class)
@JsonFormat(
shape = JsonFormat.Shape.STRING,
pattern = "dd-MM-yyyy hh:mm:ss")
private Date dateOfBirth;
@JsonView(Views.Admin.class)
private String email;
@JsonIgnore
private String password;
private Integer version;
}
因此,在本例中,对于ASP.NET中的等效功能,我需要创建2个DTO。一个用于可以公开查看的用户,另一个用于只能由管理员查看的用户
public class PublicUserDto {
public int ID {get; set;}
public String Name {get; set;}
}
public class AdminUserDto {
public int ID {get; set;}
public String Name {get; set;}
public DateTime DateOfBirth {get; set;}
public string Email {get; set;}
}
有没有更好的解决办法?是否有某种机制可用于在ASP.NET Web API中创建数据视图?JSON.NET有一种称为。可以使用以下格式编写方法:
public bool ShouldSerialize[YourPropertyName]() => someBoolCondition;
JSON.NET将调用该方法来确定该属性是否应序列化。所以你可以有这样的东西:
public DateTime DateOfBirth {get; set;}
public bool ShouldSerializeDateOfBirth() => isAdmin;
它不如JsonView漂亮,但它应该可以完成这项工作。您可以使用自定义契约解析器自己实现它。假设您具有以下属性:
[AttributeUsage(AttributeTargets.Property | AttributeTargets.Field)]
public class JsonViewAttribute : Attribute {
public JsonViewAttribute(string viewName) {
ViewName = viewName;
}
public string ViewName { get; }
}
观点:
public static class JsonViews {
public const string Administrator = "Administrator";
}
和DTO类:
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; }
}
您的目标是仅当当前用户经过身份验证并且具有目标角色(“管理员”)时,才序列化用JsonView
修饰的属性。然后您可以像这样创建合同解析程序:
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) {
// if decorated with attribute
property.ShouldSerialize = (instance) => {
var context = HttpContext.Current;
if (context == null)
return true;
// we are in context of http request
if (context.User == null || context.User.Identity == null)
return false;
// should serialize only if user is in target role
return context.User.Identity.IsAuthenticated && context.User.IsInRole(viewAttr.ViewName);
};
}
return property;
}
}
[System.Web.Http.HttpGet]
public UserDto Get()
{
return new UserDto()
{
ID = 1,
DateOfBirth = DateTime.UtcNow,
Email = "test",
Name = "name"
};
}
现在,无论何时在控制器中返回json,如下所示:
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) {
// if decorated with attribute
property.ShouldSerialize = (instance) => {
var context = HttpContext.Current;
if (context == null)
return true;
// we are in context of http request
if (context.User == null || context.User.Identity == null)
return false;
// should serialize only if user is in target role
return context.User.Identity.IsAuthenticated && context.User.IsInRole(viewAttr.ViewName);
};
}
return property;
}
}
[System.Web.Http.HttpGet]
public UserDto Get()
{
return new UserDto()
{
ID = 1,
DateOfBirth = DateTime.UtcNow,
Email = "test",
Name = "name"
};
}
并且它被序列化为json-如果用户不是管理员,则将省略admin属性
请注意,如果要执行此操作:
[System.Web.Http.HttpGet]
public IHttpActionResult Get()
{
return Json(new UserDto()
{
ID = 1,
DateOfBirth = DateTime.UtcNow,
Email = "test",
Name = "name"
});
}
不使用格式化程序,您必须自己通过自定义格式化程序传递序列化设置(当然,您需要将其转换为可重用的方法,例如,在基础控制器中声明Json方法,所有其他方法都从该方法继承):
使用角色只是一个示例,演示如何扩展asp.NET api默认使用的JSON.NET序列化程序以实现所需的结果。您也可以使用ServiceStack来实现此功能。