Filtrado de propiedades en una API principal de ASP.NET
json json.net (1)
Puede usar dynamic
con ExpandoObject
para crear un objeto dinámico que contenga las propiedades que necesita. ExpandoObject es lo que usa una palabra clave dynamic
bajo el capó, que permite agregar y eliminar propiedades / métodos dinámicamente en el tiempo de ejecución.
[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);
}
Esto resulta en
{"Name":"Muhammad Rehan Saeed","Address":{"PostCode":"AB1 2CD"}}
Simplemente necesitaría crear un servicio / convertidor o algo similar que usará la reflexión para recorrer su tipo de entrada y solo trasladar las propiedades que especifique.
Quiero servir el siguiente JSON en mi API:
{
"id": 1
"name": "Muhammad Rehan Saeed",
"phone": "123456789",
"address": {
"address": "Main Street",
"postCode": "AB1 2CD"
}
}
Quiero darle al cliente la capacidad de filtrar las propiedades que no le interesan. De modo que la siguiente URL devuelve un subconjunto de JSON:
`/api/contact/1?include=name,address.postcode
{
"name": "Muhammad Rehan Saeed",
"address": {
"postCode": "AB1 2CD"
}
}
¿Cuál es la mejor manera de implementar esta característica en ASP.NET Core para que:
- La solución podría aplicarse globalmente o en un único controlador o acción como un filtro.
- Si la solución utiliza la reflexión, también debe haber una forma de optimizar una acción de controlador particular dándole un código para filtrar las propiedades manualmente por motivos de rendimiento.
- Debería ser compatible con JSON, pero sería bueno admitir otros formatos de serialización como XML.
Encontré esta solución que usa un JSON.Net ContractResolver personalizado. Una resolución de contrato podría aplicarse globalmente al agregarla al resuelve de contrato predeterminado utilizado por ASP.Net Core o manualmente a una sola acción como esta muestra de código pero no a un controlador. Además, esta es una implementación específica de JSON.