筛选出ASP.NET核心API中的属性
我想在API中提供以下JSON:筛选出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
{
"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.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"}}