过滤掉 ASP.NET 核心 API 中的属性
Filtering Out Properties in an ASP.NET Core API
我想在我的 API 中提供以下 JSON:
{
"id": 1
"name": "Muhammad Rehan Saeed",
"phone": "123456789",
"address": {
"address": "Main Street",
"postCode": "AB1 2CD"
}
}
我想让客户能够过滤掉他们不感兴趣的属性。这样下面的 URL returns JSON 的一个子集:
`/api/contact/1?include=name,address.postcode
{
"name": "Muhammad Rehan Saeed",
"address": {
"postCode": "AB1 2CD"
}
}
在 ASP.NET 核心中实现此功能的最佳方式是什么,以便:
- 该解决方案可以全局应用,也可以应用于单个控制器或过滤器等操作。
- 如果解决方案使用反射,那么还必须有一种方法来优化特定的控制器操作,方法是为它提供一些代码以出于性能原因手动过滤掉属性。
- 它应该支持 JSON 但如果支持其他序列化格式就好了 XML.
我找到了 this solution which uses a custom JSON.Net ContractResolver. A contract resolver could be applied globally by adding it to the default contract resolver used by ASP.Net Core or manually to a single action like this 代码示例,但没有找到控制器。此外,这是一个 JSON 特定的实现。
您可以使用 dynamic
和 ExpandoObject
来创建包含您需要的属性的动态对象。 ExpandoObject 是 dynamic
关键字在后台使用的内容,它允许在运行时动态添加和删除 properties/methods。
[HttpGet("test")]
public IActionResult Test()
{
dynamic person = new System.Dynamic.ExpandoObject();
var personDictionary = (IDictionary<string, object>)person;
personDictionary.Add("Name", "Muhammad Rehan Saeed");
dynamic address = new System.Dynamic.ExpandoObject();
var addressDictionary = (IDictionary<string, object>)address;
addressDictionary.Add("PostCode", "AB1 2CD");
personDictionary.Add("Address", address);
return Json(person);
}
这导致
{"Name":"Muhammad Rehan Saeed","Address":{"PostCode":"AB1 2CD"}}
您只需要创建一个 service/converter 或类似的东西,它们将使用反射循环遍历您的输入类型,并且只继承您指定的属性。
我想在我的 API 中提供以下 JSON:
{
"id": 1
"name": "Muhammad Rehan Saeed",
"phone": "123456789",
"address": {
"address": "Main Street",
"postCode": "AB1 2CD"
}
}
我想让客户能够过滤掉他们不感兴趣的属性。这样下面的 URL returns JSON 的一个子集:
`/api/contact/1?include=name,address.postcode
{
"name": "Muhammad Rehan Saeed",
"address": {
"postCode": "AB1 2CD"
}
}
在 ASP.NET 核心中实现此功能的最佳方式是什么,以便:
- 该解决方案可以全局应用,也可以应用于单个控制器或过滤器等操作。
- 如果解决方案使用反射,那么还必须有一种方法来优化特定的控制器操作,方法是为它提供一些代码以出于性能原因手动过滤掉属性。
- 它应该支持 JSON 但如果支持其他序列化格式就好了 XML.
我找到了 this solution which uses a custom JSON.Net ContractResolver. A contract resolver could be applied globally by adding it to the default contract resolver used by ASP.Net Core or manually to a single action like this 代码示例,但没有找到控制器。此外,这是一个 JSON 特定的实现。
您可以使用 dynamic
和 ExpandoObject
来创建包含您需要的属性的动态对象。 ExpandoObject 是 dynamic
关键字在后台使用的内容,它允许在运行时动态添加和删除 properties/methods。
[HttpGet("test")]
public IActionResult Test()
{
dynamic person = new System.Dynamic.ExpandoObject();
var personDictionary = (IDictionary<string, object>)person;
personDictionary.Add("Name", "Muhammad Rehan Saeed");
dynamic address = new System.Dynamic.ExpandoObject();
var addressDictionary = (IDictionary<string, object>)address;
addressDictionary.Add("PostCode", "AB1 2CD");
personDictionary.Add("Address", address);
return Json(person);
}
这导致
{"Name":"Muhammad Rehan Saeed","Address":{"PostCode":"AB1 2CD"}}
您只需要创建一个 service/converter 或类似的东西,它们将使用反射循环遍历您的输入类型,并且只继承您指定的属性。