c# - 如何使用 asp.net 核心捕获 JSON Web api 请求中包含的属性名称?
问题描述
我正在构建一个 asp.net 核心 web api,我需要跟踪实际包含在 JSON 主体中的属性,因为 .NET 没有 javascript 中的未定义概念,只是 null。
我创建了一个接口,我的所有模型都实现了它,它只是一个名为 IncludedProperties 的字符串数组:
string[] IncludedProperties {get; set;}
我可能有一些模型,其中嵌套了更多这些模型。每当我反序列化其中一个模型时,我都希望它填充这个 IncludedProperties 列表。
例如,在我的控制器中:
public async Task<ActionResult> PatchModel([FromRoute]Guid id, [FromBody] RootModel model) { ... }
类被定义为:
public class RootModel : IIncludedProperties
{
public string Name { get; set;}
public string Description {get; set;}
public NestedModel SubEntity { get; set;}
public string[] IncludedProperties {get; set;}
}
public class NestedModel : IIncludedProperties
{
public string Name {get; set;}
public decimal Value {get; set;}
public string[] IncludedProperties {get; set;}
}
如果 JSON 正文如下:
{
"Name": "New Entity 01",
"SubEntity": {
"Name": "Child Entity 01",
"Value": 0.5
}
}
根[ "Name", "SubEntity"]
的包含属性是 ,嵌套模型的包含属性是[ "Name", "Value" ]
。
我正在阅读 Microsoft 关于JSON 的自定义转换器的文档,但似乎我需要重写整个 json 转换器只是为了添加一些额外的功能。有什么方法可以“插入”现有的转换器,只是为了捕获包含的属性名称?
解决方案
这可以通过反射和递归来解决。如果您不介意在每个控制器中再添加一行,则可以在模型绑定后调用此函数:
void PopulateIncludedProperties(IIncludedProperties obj)
{
var properties = obj.GetType().GetProperties().ToList();
obj.IncludedProperties = properties
.Where(p => p.Name != "IncludedProperties" && p.GetValue(obj) != null)
.Select(p => p.Name).ToArray();
foreach (var prop in properties)
{
var value = prop.GetValue(obj);
if (value is IIncludedProperties includedPropValue)
{
PopulateIncludedProperties(includedPropValue);
}
}
}
如果您想填充IncludedProperties
一个IEnumerable<IIncludedProperties>
推荐阅读
- javascript - EventSource 重新连接时,一些服务器发送的事件丢失
- dataframe - Spark DataFrame:忽略groupBy中具有空ID的列
- javascript - 测试 axios 请求的 headers
- mysql - 我正在尝试使用 AWS DMS 在 MySQL 数据库上实施 CDC。在我的 dms 迁移任务中出现以下错误:
- laravel - 如何从 laravel 中与 auth 用户相关的表中获取变量?
- uwp - 是否有适用于 UWP 应用开发的 web.config?
- django - 如何修复此错误“精确查找的 QuerySet 值必须限制为使用切片的一个结果。”
- python - 通过python发送HTML电子邮件,格式错误
- .net - AzureFunctionapp APPSETTING_ 被追加
- html - 我的 wordpress 主页上的社交媒体图标在 OceanWP 主题上使用 FontAwesome 正确显示