Estoy desarrollando una API para exponer algunos datos usando la API web ASP.NET.
En una de las API, el cliente quiere que expongamos la fecha en yyyy-MM-dd
formato. No quiero cambiar la configuración global (por ejemplo GlobalConfiguration.Configuration.Formatters.JsonFormatter
) para eso, ya que es muy específico para este cliente. Y lo desarrollo en una solución para múltiples clientes.
Una de las soluciones que se me JsonConverter
ocurre es crear una personalizada y luego ponerla en la propiedad que necesito para el formateo personalizado.
p.ej
class ReturnObjectA
{
[JsonConverter(typeof(CustomDateTimeConverter))]
public DateTime ReturnDate { get;set;}
}
Solo me pregunto si hay alguna otra manera fácil de hacerlo.
c#
datetime
asp.net-web-api
json.net
Mantenerse tonto
fuente
fuente
Respuestas:
Estás en el camino correcto. Como usted dijo que no puede modificar la configuración global, lo mejor que puede hacer es aplicar el
JsonConverter
atributo según sea necesario, como lo sugirió. Resulta que Json.Net ya tiene un incorporadoIsoDateTimeConverter
que le permite especificar el formato de fecha. Desafortunadamente, no puede establecer el formato a través delJsonConverter
atributo, ya que el único argumento del atributo es un tipo. Sin embargo, hay una solución simple: subclaseIsoDateTimeConverter
, luego especifique el formato de fecha en el constructor de la subclase. Aplique elJsonConverter
atributo donde sea necesario, especifique su convertidor personalizado y estará listo para comenzar. Aquí está la totalidad del código necesario:Si no le importa tener tiempo allí también, ni siquiera necesita subclasificar el IsoDateTimeConverter. Su formato de fecha predeterminado es
yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK
(como se ve en el código fuente ).fuente
IsonDateTimeConverter
fue tomado directamente del código fuente de Json.Net ; por lo tanto, estoy volviendo tu edición sobre eso.Podrías usar este enfoque:
Y úsalo de esta manera:
La cadena DateTimeFormat utiliza la sintaxis de cadena en formato .NET descrita aquí: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings
fuente
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
'JsonConverterAttribute' does not contain a constructor that takes 2 arguments
significa que su versión de json.net es demasiado antigua. Necesita actualizar a la última versión de json.net.También se puede hacer con una
IsoDateTimeConverter
instancia, sin cambiar la configuración de formato global:Esto usa la
JsonConvert.SerializeObject
sobrecarga que toma unparams JsonConverter[]
argumento.fuente
También disponible con una de las sobrecargas de configuración del serializador:
O
Las sobrecargas que toman un tipo también están disponibles.
fuente
yyyy-MM-ddTHH:mm:ssZ
.. 24 horas en las horas.Cree una clase auxiliar y aplíquela a su atributo de propiedad
Clase auxiliar:
Su código se usa así:
fuente
Hay otra solución que he estado usando. Simplemente cree una propiedad de cadena y úsela para json. Esta propiedad tendrá una fecha de devolución con el formato correcto.
De esta manera no tienes que crear clases adicionales. Además, le permite crear diferentes formatos de datos. por ejemplo, puede crear fácilmente otra propiedad por hora utilizando la misma fecha y hora.
fuente
Algunas veces decorar el atributo json convert no funcionará, lo hará a través de la excepción diciendo que " 2010-10-01" es una fecha válida . Para evitar este tipo, eliminé el atributo json convert en la propiedad y lo mencioné en el método deserilizedObject como se muestra a continuación.
fuente
Con el siguiente convertidor
Puede usarlo con un formato personalizado predeterminado
O cualquier formato especificado para una propiedad
fuente