首页 > 解决方案 > 从 API 中仅返回对象属性的子集

问题描述

假设我有一个数据库,我在其中存储此结构的用户详细信息:

public class User
{
    public string UserId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string PasswordHash { get; set; }
}

我有一个与之配合使用的数据访问层,其中包含诸如 GetById() 之类的方法并返回给我一个用户对象。

但是然后说我有一个需要返回用户详细信息的 API,而不是像 PasswordHash 这样的敏感部分。我可以从数据库中获取用户,但是我需要删除某些字段。这样做的“正确”方法是什么?

我想了几种方法来处理这个问题,其中大部分涉及将 User 类拆分为具有非敏感数据的 BaseClass 和包含我希望保密的属性的派生类,然后将对象转换或映射到BaseClass 在返回它之前,但是这感觉笨重和肮脏。

感觉这应该是一个相对常见的场景,所以我错过了一个简单的方法来处理它吗?我正在专门使用 ASP.Net 核心和 MongoDB,但我想这更像是一个普遍的问题。

标签: c#asp.net-core.net-core

解决方案


如果您想忽略该属性,只需像这样在您的模型中添加忽略注释,它会在模型​​序列化时跳过该属性。

[JsonIgnore] 
public string PasswordHash { get; set; }

如果你想在运行时忽略(这意味着动态)。Newtonsoft.Json 中有构建函数可用

public class User
{
    public string UserId { get; set; }
    public string Name { get; set; }
    public string Email { get; set; }
    public string PasswordHash { get; set; }
    //FYI ShouldSerialize_PROPERTY_NAME_HERE()
   public bool ShouldSerializePasswordHash()
    {
        // use the condtion when it will be serlized
        return (PasswordHash != this);
    }
}

它被称为“条件属性序列化”,文档可以在这里找到。 希望这可以帮助


推荐阅读