动态选择要在核心 asp.net JSON 响应中序列化的属性



我有一个这样的控制器:

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/valuesGET应返回一个对象及其所有属性:

{
"FirstName":"John",
"LastName":"Doe"
}

同时,要api/values?fields=FirstNameGET应仅返回 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);

最新更新