c# - 从 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,但我想这更像是一个普遍的问题。
解决方案
如果您想忽略该属性,只需像这样在您的模型中添加忽略注释,它会在模型序列化时跳过该属性。
[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);
}
}
它被称为“条件属性序列化”,文档可以在这里找到。 希望这可以帮助
推荐阅读
- laravel - Laravel updateExistingPivot 不断返回 false
- kali-linux - 为什么 Kali Linux 提示我输入我没有创建的用户名和密码
- android - 列出多窗口支持的所有应用程序
- php - $_POST 未定义使用 Ajax 从 php 文件中检索一些信息
- php - 如何使用 API 创建 Paypal 连接(付款前卖家入职)帐户?
- flutter - Flutter - 哪个小部件最适合实时缩放具有 0 到 1 值的图像?
- netlogo - 在特定补丁中更改 1 只海龟的海龟品种
- django - Django 编辑或删除表中的选定行 - ListView
- spring-boot - 我是spring boot的新手,请帮我解决这个问题
- git - 如何添加新的本地分支来跟踪 GitHub 页面(gh-pages)创建的远程分支?