我有一个这样的控制器:
using Microsoft.AspNetCore.Mvc;
public class Person {
public string FirstName { get; set; }
public string LastName { get; set; }
}
[Route("api/[controller]")]
public class ValuesController : Controller {
[HttpGet]
public IActionResult Get() {
return new OkObjectResult(new[] {
new Person { FirstName = "John", LastName = "Doe" }
});
}
}
我希望能够在 asp.net 核心 REST API 中指定我想要的响应属性。
例如,要api/values
GET
应返回一个对象及其所有属性:
{
"FirstName":"John",
"LastName":"Doe"
}
同时,要api/values?fields=FirstName
GET
应仅返回 FirstName 属性:
{
"FirstName":"John"
}
我尝试在我的 Startup 类中指定一个合约解析器,如下所示:
class QueryStringResolver : DefaultContractResolver {
protected override IList<JsonProperty> CreateProperties(Type type, MemberSerialization memberSerialization) {
HttpContextAccessor httpContextAccessor = new HttpContextAccessor();
string fieldsQuery = httpContextAccessor.HttpContext.Request.Query["fields"];
if (!string.IsNullOrEmpty(fieldsQuery)) {
var fields = from f in fieldsQuery.Split(",", StringSplitOptions.RemoveEmptyEntries) select f.Trim().ToLowerInvariant();
return base.CreateProperties(type, memberSerialization).Where(p => fields.Contains(p.PropertyName.ToLowerInvariant())).ToList();
} else {
return base.CreateProperties(type, memberSerialization);
}
}
}
public class Startup {
public void ConfigureServices(IServiceCollection services) {
services
.AddMvc()
.AddJsonOptions(options => {
options.SerializerSettings.ContractResolver = new QueryStringResolver();
});
}
// rest of Startup class omitted...
}
问题是CreateProperties
方法仅在第一个请求时调用,而不是针对每个请求调用。
有没有办法指定每个请求时应序列化哪些属性?
请注意,我不想更改 Get 方法实现或返回的类定义,我只想对序列化进行操作,以便我可以在多个方法中重复使用相同的查询字符串参数。
使用所需的值创建一个通用对象。
var obj = new {
FirstName = "John"
, LastName = "Doe"
};
var json = JsonConvert.SerializeObject(obj);