筛选出ASP.NET核心API中的属性

筛选出ASP.NET核心API中的属性,asp.net,json,json.net,asp.net-core,asp.net-core-1.0,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=姓名、地址、邮编 在ASP.NET Core

我想在API中提供以下JSON:

{
  "id": 1
  "name": "Muhammad Rehan Saeed",
  "phone": "123456789",
  "address": {
    "address": "Main Street",
    "postCode": "AB1 2CD"
  }
}
我想让客户能够过滤出他们不感兴趣的属性。因此,以下URL返回JSON的子集:

`/api/contact/1?include=姓名、地址、邮编

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

  • 该解决方案可以全局应用,也可以在单个控制器或类似过滤器的操作上应用
  • 如果解决方案使用反射,那么还必须有一种方法来优化特定的控制器操作,方法是为其提供一些代码,以便出于性能原因手动筛选出属性
  • 它应该支持JSON,但最好支持其他序列化格式,如XML

  • 我找到了使用自定义JSON.Net的解决方案。契约解析程序可以全局应用,方法是将其添加到ASP.Net Core使用的默认契约解析程序中,或手动添加到单个操作(如代码示例)中,但不添加到控制器中。另外,这是一个特定于JSON的实现。

    您可以使用
    动态
    扩展对象
    来创建包含所需属性的动态对象。是
    dynamic
    关键字在引擎盖下使用的内容,它允许在运行时动态添加和删除属性/方法

    [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);
    }
    

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

    这是一个可靠的链接,我发布的链接也有类似的功能。问题是,在ASP.NET核心中使用这些扩展方法的最佳方式是什么?另外,这个解决方案解决了JSON的问题,但是XML呢?这篇博文对我很有帮助。您应该开始考虑GraphQL,如您的示例所示,从动态中的属性被序列化为PASCALCASE(或“AS IS”),而正常类中的属性默认地在.NETCARE中序列化为CAMELCALL。你知道我们如何制作动态属性吗?@NielsBrinch:很抱歉没有看到前面的评论,但是
    dynamic
    在引擎盖下只使用了
    ExpandoObject
    ,这是一个
    IDictionary
    ,所以在序列化它时,你可以有效地将字典序列化为JSON对象
    [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"}}