Десериализация дат с форматом dd / mm / yyyy с использованием Json.Net

Я пытаюсь десериализовать объект из данных JSON в class C # (я использую Newtonsoft Json.NET): данные содержат даты в строковом значении, такие как 09/12/2013 где формат dd/mm/yyyy .

Если я вызываю JsonConvert.DeserializeObject(data); даты загружаются в свойство datetimes classа C #, например mm/dd/yyyy , а затем значение даты – 12 сентября 2013 года (вместо 9 декабря 2013 года).

Можно ли настроить JsonConvert для получения даты в правильном формате?

Вы можете использовать IsoDateTimeConverter и указать DateTimeFormat чтобы получить IsoDateTimeConverter результат, например:

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

Демо-версия:

 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; } } 

Вывод:

 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); 

Вы также можете настроить его в JsonSerializer:

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

Добавить культуру в WebConfig:

    

Затем добавьте fragment кода ниже в файле WebApiConfig.cs

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

Культура pt-BR работает со стандартным dd-MM-yyyy , если вы не хотите размещать культуру в WebConfig, вы можете создать экземпляр только для этого объекта.

По моему опыту, самым простым и простым решением всегда является добавление свойства string в ваш объект CLR ( MyObject ) в вашем случае для использования JSON.Net. Также на вашем объекте вы помещаете свойство DateTime в качестве получателя, которое будет анализировать строку datetime, которую вы десериализовали, используя JSON.Net в ожидаемом формате.

Это позволяет вам использовать десериализатор из коробки и полагаться на хороший ol ‘fashioned c #, чтобы выполнить эту работу. Никакой муссы, никакой суеты.

 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; } } } 
  • Интерфейсы для десериализации в JSON.NET
  • Как создать JSON.NET Date to String custom Converter
  • Можно ли указать путь в атрибуте для сопоставления свойства в моем classе с дочерним свойством в моем JSON?
  • Json.net сериализует определенное частное поле
  • C # JSON.NET - десериализация ответа, использующего необычную структуру данных
  • Как преобразовать массив Json в список объектов в c #
  • Как разобрать объект JSON на C #, если я заранее не знаю ключ?
  • Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net
  • Преобразовать Newtonsoft.Json.Linq.JArray в список определенного типа объекта
  • Сериализовать контейнер перечислений в виде строк с помощью JSON.net
  • Как использовать JSON.NET для десериализации в вложенный / рекурсивный словарь и список?
  • Давайте будем гением компьютера.