asp.net - 过滤掉 ASP.NET Core API 中的属性

标签 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 中实现此功能的最佳方法是什么,以便:
  • 该解决方案可以应用于全局,也可以应用于单个 Controller 或过滤器等 Action 。
  • 如果解决方案使用反射,那么还必须有一种方法来优化特定的 Controller 操作,方法是为其提供一些代码以出于性能原因手动过滤掉属性。
  • 它应该支持 JSON,但如果支持其他序列化格式(如 XML)会很好。

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

    最佳答案

    您可以使用 dynamicExpandoObject创建一个包含您需要的属性的动态对象。 ExpandoObject是什么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);
    }
    

    这导致
    {"Name":"Muhammad Rehan Saeed","Address":{"PostCode":"AB1 2CD"}}
    

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

    关于asp.net - 过滤掉 ASP.NET Core API 中的属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36369970/

    相关文章:

    json.Unmarshal 无法正常工作

    c# - 将 JSON 对象反序列化为动态类型但访问属性时出现 RuntimeBinderException?

    c# - 将 JSON 反序列化为 List<T> 时出错

    asp.net - LINQ to SQL、ExecuteQuery 等

    asp.net - 禁用时事件不会在下拉列表中触发

    java - JSON 上的 for 循环出现问题

    arrays - 使用 Newtonsoft Json.NET 循环使用动态对象 ID 的非数组 JSON

    asp.net - 我的 IIS7 URL 重写规则不断消失

    c# - 将报价与日期时间进行比较(从现在开始 5 分钟)

    php - ASyncTask HTTP 错误