Forzar JSON.NET para que incluya milisegundos al serializar DateTime (incluso si el componente ms es cero)

Estoy usando JSON.NET para serializar los valores de DateTime directamente desde las instancias de los objetos (no usando DateTime.ToString () con el formateador).

¿Hay alguna manera de forzar a JSON.NET a incluir milisegundos en la serialización incluso si el componente de milisegundos de DateTime es cero?

Antecedentes: tengo un consumidor de servicios web muy lento para este punto final JSON. La lógica condicional es costosa para el consumidor, por lo que me gustaría proporcionar el mismo formato de datos cada vez.

Nos encontramos con este mismo problema en mi proyecto actual. Estamos usando Web API (y por lo tanto, JSON.Net) para implementar una API REST. Descubrimos que, al serializar objetos DateTime , JSON.Net omite los ceros finales de los milisegundos, u omite los milisegundos de la fecha completamente si es cero. Nuestros clientes esperaban una cadena de fecha y hora de duración fija, con exactamente 3 dígitos para los milisegundos. Lo solucionamos haciendo lo siguiente en Application_Start() :

 JsonSerializerSettings settings = HttpConfiguration.Formatters.JsonFormatter.SerializerSettings; IsoDateTimeConverter dateConverter = new IsoDateTimeConverter { DateTimeFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss.fff'Z'" }; settings.Converters.Add(dateConverter); 

Si no está utilizando la API web, puede hacer lo mismo creando una nueva instancia de JsonSerializerSettings , agregando el IsoDateTimeConverter como se muestra arriba, y luego pasando la configuración del serializador a JsonConvert.SerializeObject() .

Nota: Si está serializando un DateTimeOffset o un DateTime local y desea incluir el desplazamiento de la zona horaria, reemplace el 'Z' citado en el formato anterior con un K cita. Consulte Cadenas de formato de fecha y hora personalizadas en la documentación para obtener más información.

Para cualquier persona de Java que encuentre esta respuesta y desee analizar esas marcas de tiempo formateadas por defecto de .NET, quiero señalar un enfoque de Java 8 ( java.time.* ) Para analizar el formato:

 public static final DateTimeFormatter FORMATTER = new DateTimeFormatterBuilder().appendPattern("yyyy-M-d'T'H:m:s") .appendFraction(ChronoField.MILLI_OF_SECOND, 0, 3, true) .toFormatter(); ... LocalDateTime ldt = LocalDateTime.parse(dateString, FORMATTER); 

Esto dice esperar 0-3 dígitos de milisegundos fraccionarios, con true para un punto decimal esperado. Interpreta correctamente, digamos, “.47” como 470 milisegundos.