Fecha de deserialización con formato dd / mm / aaaa usando Json.Net

Estoy tratando de deserializar un objeto de datos JSON a una clase C # (estoy usando Newtonsoft Json.NET): los datos contienen fechas en el valor de cadena como 09/12/2013 donde el formato es dd/mm/yyyy .

Si llamo a JsonConvert.DeserializeObject(data); las fechas se cargan en la propiedad datetimes de la clase C # como mm/dd/yyyy , y luego el valor de la fecha es el 12 de septiembre de 2013 (en lugar del 9 de diciembre de 2013).

¿Es posible configurar JsonConvert para obtener la fecha en el formato correcto?

Puede usar un IsoDateTimeConverter y especificar el DateTimeFormat para obtener el resultado que desea, por ejemplo:

 MyObject obj = JsonConvert.DeserializeObject(jsonString, new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" }); 

Manifestación:

 class Program { static void Main(string[] args) { string json = @"{ ""Date"" : ""09/12/2013"" }"; MyObject obj = JsonConvert.DeserializeObject(json, new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" }); DateTime date = obj.Date; Console.WriteLine("day = " + date.Day); Console.WriteLine("month = " + date.Month); Console.WriteLine("year = " + date.Year); } } class MyObject { public DateTime Date { get; set; } } 

Salida:

 day = 9 month = 12 year = 2013 
 using Newtonsoft.Json; using Newtonsoft.Json.Converters; var dateTimeConverter = new IsoDateTimeConverter { DateTimeFormat = "dd/MM/yyyy" }; myObject obj = JsonConvert.DeserializeObject(myJSONString, dateTimeConverter); 

También puede configurarlo en JsonSerializer:

 var serializer = new JsonSerializer { DateFormatString = "dd/MM/yyyy" }; 

Agregar cultura en WebConfig:

    

A continuación, agregue el fragmento de código a continuación en el archivo WebApiConfig.cs

 var jsonFormatter = GlobalConfiguration.Configuration.Formatters.JsonFormatter; JsonSerializerSettings jSettings = new JsonSerializerSettings() { Culture = System.Globalization.CultureInfo.CurrentCulture }; jsonFormatter.SerializerSettings = jSettings; 

La cultura pt-BR funciona con el valor predeterminado dd-MM-yyyy , si no desea poner la cultura en WebConfig, puede crear una instancia solo para ese objeto.

En mi experiencia, la solución más simple y fácil es siempre agregar una propiedad de string en su objeto CLR ( MyObject ) en su caso para que lo use JSON.Net. También en su objeto coloca una propiedad DateTime , solo como absorbente, que analizará la cadena de fecha y hora que ha deserializado utilizando JSON.Net en el formato que espera.

Esto le permite usar el deserializador de la caja y confiar en el c # old fashioned para hacer el trabajo. Sin despeinarse sin problemas.

 public class MyObject { public string dtStr { get; set; } public DateTime? dt { get { DateTime? d = null; if (!string.IsNullOrWhiteSpace(dtStr) && DateTime.TryParseExact(dtStr, "dd/mm/yyyy", CultureInfo.InvariantCultureDateTimeStyles.None, out d) { return d; } return d; } } }