I want to use different formats for DateTime
fields regarding query string parameter: i.e if query string contains dateFormat=iso
parameter, I want to return dates in ISO 6801:
{
"date": "2018-03-27T12:20:34.248563Z"
}
But if query string contains dateFormat=unix
parameter, I want to return dates in UNIX time:
{
"date": 1522152517
}
It is pretty easy to achieve using JsonResult
and ResultFilter
:
public class DateFormatResultFilter : IAsyncResultFilter
{
public async Task OnResultExecutionAsync(ResultExecutingContext context,ResultExecutionDelegate next)
{
var dateTimeFormat = context.HttpContext.Request.Query["dateFormat"].FirstOrDefault() ?? "iso8601";
var converter = GetConverter(dateTimeFormat);
var jsonSettings = context.HttpContext.RequestServices
.GetRequiredService<IOptionsSnapshot<MvcJsonOptions>>()
.Value.SerializerSettings;
jsonSettings.Converters.Add(converter);
if (context.Result is JsonResult jsonResult)
{
var value = jsonResult.Value;
context.Result = new JsonResult(value, jsonSettings);
}
await next();
}
}
I don't want to scramble the global JsonSerializerSettings
, so I resolve IOptionsSnapshot<MvcJsonOptions>
instead of IOptions<MvcJsonOptions>
.
But how can I achieve this behavior for ObjectResult
?