加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

过滤ASP.NET Core API中的属性

发布时间:2020-12-15 19:50:54 所属栏目:asp.Net 来源:网络整理
导读:我想在我的API中提供以下 JSON: { "id": 1 "name": "Muhammad Rehan Saeed","phone": "123456789","address": { "address": "Main Street","postCode": "AB1 2CD" }} 我想让客户端能够过滤掉他们不感兴趣的属性.以便以下URL返回JSON的子集: `/api/contact/
我想在我的API中提供以下 JSON:
{
  "id": 1
  "name": "Muhammad Rehan Saeed","phone": "123456789","address": {
    "address": "Main Street","postCode": "AB1 2CD"
  }
}

我想让客户端能够过滤掉他们不感兴趣的属性.以便以下URL返回JSON的子集:

`/api/contact/1?include=name,address.postcode

{
  "name": "Muhammad Rehan Saeed","address": {
    "postCode": "AB1 2CD"
  }
}

在ASP.NET Core中实现此功能的最佳方法是什么,以便:

>该解决方案可以全局应用,也可以应用于单个控制器或过滤器等操作.
>如果解决方案使用反射,那么还必须有一种方法来优化特定的控制器操作,方法是为了性能原因手动过滤掉属性.
>它应该支持JSON,但很高兴支持其他序列化格式,如XML.

我找到了使用自定义JSON.Net ContractResolver的this解决方案.合同解析程序可以通过将其添加到ASP.Net Core使用的默认合同解析程序或手动添加到单个操作(如this代码示例而不是控制器)来全局应用.此外,这是一个特定于JSON的实现.

解决方法

您可以使用Dynamic与ExpandoObject一起创建包含所需属性的动态对象. ExpandoObject是动态关键字在底层使用的内容,它允许在运行时动态添加和删除属性/方法.
[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"}}

您只需要创建一个服务/转换器或类似的东西,它将使用反射来循环您的输入类型,并且只承载您指定的属性.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读