过滤ASP.NET Core API中的属性

时间:2016-04-02 06:27:00

标签: asp.net json json.net asp.net-core asp.net-core-1.0

我想在我的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中实现此功能的最佳方法是:

  1. 该解决方案可以全局应用,也可以应用于单个控制器或过滤器等操作。
  2. 如果解决方案使用反射,那么还必须有一种方法来优化特定的控制器操作,方法是为了性能原因手动过滤掉属性。
  3. 它应该支持JSON,但很高兴支持其他序列化格式,如XML。
  4. 我找到了使用自定义JSON.Net thisContractResolver解决方案。合同解析程序可以通过将其添加到ASP.Net Core使用的默认合同解析程序或手动添加到this代码示例等单个操作而不是控制器来全局应用。此外,这是一个特定于JSON的实现。

1 个答案:

答案 0 :(得分:4)

您可以将dynamicExpandoObject一起使用来创建包含所需属性的动态对象。 ExpandoObjectdynamic关键字在底层使用的内容,它允许在运行时动态添加和删除属性/方法。

[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"}}

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