tl; dr: ¿Cómo puedo agregar DateOnly JsonConverter a la configuración de la aplicación de una API web .net6?
Tengo un objeto con propiedades DateOnly y lo devuelvo desde el controlador. Cuando realizo mi solicitud, aparece el error "No se admite la serialización y deserialización de instancias 'System.DateOnly'".
Entiendo que existen limitaciones con la deserialización de DateOnly y TimeOnly en .net6 ( https://github.com/dotnet/runtime/issues/53539 ) y seguí el uso recomendado de un JsonConverter personalizado. Sin embargo, el problema que tengo es dónde inicializo el convertidor.
Intenté agregar el convertidor en el generador de aplicaciones web....
builder.Services .AddControllers() .AddJsonOptions(options => options.JsonSerializerOptions.Converters.Add(new DateOnlyConverter()));
pero sin suerte.
Luego intenté configurarlo específicamente
builder.Services.Configure<JsonSerializerOptions>(options => options.Converters.Add(new DateOnlyConverter()));
allí tampoco hubo suerte.
Así que intenté devolver Results.Json desde el controlador con el convertidor en las opciones Results.Json(status, options)
. Incluso eso no funcionó.
Sin embargo, lo que funcionó fue agregar un atributo directamente a la propiedad
[property: JsonConverter(typeof(DateOnlyConverter))] DateOnly DateOrdered,
Preferiría no tener que agregar este atributo a cada uso de DateOnly y no tengo muy claro qué impide que se llame al convertidor cuando está configurado como parte de WebApplication. He hecho cosas similares en aplicaciones .net5 y asumo que algunos matices entre IHostBuilder y WebApplicationBuilder podrían estar causando el problema.
Editar: probablemente valga la pena señalar que estoy usando las nuevas API mínimas. Pero incluso Microsoft señala que la serialización de Json se puede configurar en los documentos aquí . Los documentos muestran una sintaxis ligeramente diferente a la que se usa comúnmente, builder.Services.Configure<JsonOptions>
, por lo que asumí que tal vez este era el problema. Quizás las apis mínimas tenían una configuración diferente. Pero no es así. Al menos, usar la configuración sugerida en los documentos mínimos de API no resolvió el problema.
Bien, después de buscar lo suficiente pude encontrar la respuesta. Sí, la configuración de las API mínimas es independiente. La documentación estaba justo encima de donde describían la configuración de la serialización json de API mínima mediante builder.Services.Configure<JsonOptions>(options => ...)
. Con suerte, esta respuesta ayudará a cualquier otra persona en el futuro demasiado impaciente como para leer la documentación detenidamente.