Сериализация нескольких свойств DateTime в одном classе с использованием разных форматов для каждого из них

У меня есть class с двумя свойствами DateTime. Мне нужно сериализовать каждое из свойств с другим форматом. Как мне это сделать? Я пытался:

JsonConvert.SerializeObject(obj, Formatting.None, new IsoDateTimeConverter {DateTimeFormat = "MM.dd.yyyy"}); 

Это решение не работает для меня, потому что оно применяет формат даты ко всем свойствам. Есть ли способ сериализации каждого свойства DateTime в другом формате? Может быть, есть какой-то атрибут?

NewtonSoft.Json есть структура, которую трудно понять, вы можете использовать что-то вроде следующего пользовательского конвертера, чтобы делать то, что вы хотите:

 [TestMethod] public void Conversion() { var obj = new DualDate() { DateOne = new DateTime(2013, 07, 25), DateTwo = new DateTime(2013, 07, 25) }; Assert.AreEqual("{\"DateOne\":\"07.25.2013\",\"DateTwo\":\"2013-07-25T00:00:00\"}", JsonConvert.SerializeObject(obj, Formatting.None, new DualDateJsonConverter())); } class DualDate { public DateTime DateOne { get; set; } public DateTime DateTwo { get; set; } } class DualDateJsonConverter : JsonConverter { public override void WriteJson(JsonWriter writer, object value, JsonSerializer serializer) { JObject result = new JObject(); DualDate dd = (DualDate)value; result.Add("DateOne", JToken.FromObject(dd.DateOne.ToString("MM.dd.yyyy"))); result.Add("DateTwo", JToken.FromObject(dd.DateTwo)); result.WriteTo(writer); } // Other JsonConverterMethods public override bool CanConvert(Type objectType) { return objectType == typeof(DualDate); } public override bool CanWrite { get { return true; } } public override bool CanRead { get { return false; } } public override object ReadJson(JsonReader reader, Type objectType, object existingValue, JsonSerializer serializer) { throw new NotImplementedException(); } } 

IsoDateTimeConverter способом справиться с этой ситуацией является подclass IsoDateTimeConverter для создания настраиваемого конвертера даты для каждого формата даты, который вам нужен. Например:

 class MonthDayYearDateConverter : IsoDateTimeConverter { public MonthDayYearDateConverter() { DateTimeFormat = "MM.dd.yyyy"; } } class LongDateConverter : IsoDateTimeConverter { public LongDateConverter() { DateTimeFormat = "MMMM dd, yyyy"; } } 

Затем вы можете использовать [JsonConverter] чтобы украсить отдельные свойства DateTime в любых classах, которые нуждаются в специальном форматировании:

 class Foo { [JsonConverter(typeof(MonthDayYearDateConverter))] public DateTime Date1 { get; set; } [JsonConverter(typeof(LongDateConverter))] public DateTime Date2 { get; set; } // Use default formatting public DateTime Date3 { get; set; } } 

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

 Foo foo = new Foo { Date1 = DateTime.Now, Date2 = DateTime.Now, Date3 = DateTime.Now }; string json = JsonConvert.SerializeObject(foo, Formatting.Indented); Console.WriteLine(json); 

Вывод:

 { "Date1": "03.03.2014", "Date2": "March 03, 2014", "Date3": "2014-03-03T10:25:49.8885852-06:00" } 

Вы можете создать собственный class дат, который наследует IsoDateTimeConverter и передает формат конструктору. В атрибутах вы можете указать, какой формат соответствует каждому свойству. См. Следующий код:

 public class LoginResponse { [JsonProperty("access_token")] public string AccessToken { get; set; } [JsonProperty("token_type")] public string TokenType { get; set; } [JsonProperty("expires_in")] public DateTime ExpiresIn { get; set; } [JsonProperty("userName")] public string Username { get; set; } [JsonConverter(typeof(CustomDateFormat), "EEE, dd MMM yyyy HH:mm:ss zzz")] [JsonProperty(".issued")] public DateTime Issued { get; set; } [JsonConverter(typeof(CustomDateFormat), "MMMM dd, yyyy")] [JsonProperty(".expires")] public DateTime Expires { get; set; } } public class CustomDateFormat : IsoDateTimeConverter { public CustomDateFormat(string format) { DateTimeFormat = format; } } 

Я понимаю, что это старый вопрос, но я наткнулся на него во время поиска того же вопроса.

У Newtonsoft теперь есть свойство DateFormatString в classе JsonSerializerSettings, которое вы можете использовать. Я пришел к этому вопросу, ища ответ и только что нашел свойство, я использовал его, как показано ниже, и он работает следующим образом:

  private const string _StrDateFormat = "yyyy-MM-dd HH:mm:ss"; private static string GetJSON(object value) { return JsonConvert.SerializeObject(value, new JsonSerializerSettings { DateFormatString = _StrDateFormat }); } 

Когда value будет иметь объект DateTime, он преобразует его в строку, соответствующую строке _StrDateFormat .

Возможно, эта официальная ссылка может быть обновлена?

С уважением.

  • Можно ли выполнять бинарную сериализацию .NET в случае, если у вас нет исходного кода classа?
  • «Тип не ожидается», используя DataContractSerializer - но это просто class, не смешные вещи?
  • Использовать имя classа в качестве корневого ключа для сериализации JSON Jackson
  • Json.net сериализует определенное частное поле
  • Как сериализовать объект в CSV-файл?
  • Задача не сериализуема: java.io.NotSerializableException при вызове функции закрытие только для classов не объектов
  • Как использовать пользовательский Serializer с Jackson?
  • Как можно полиморфная десериализация Json String с использованием Java и библиотеки Jackson?
  • Использование преобразователей Json.NET для десериализации свойств
  • Исключение «Исключительная привязка к реляционной ссылке» с JSON.Net
  • Существуют ли эквиваленты C ++ для функций протокола ввода-вывода протокола Buffer в Java?
  • Interesting Posts

    Debian: обновление списков пакетов с помощью apt-offline, –simulate непонятно для apt-get update

    Какая разница между classами WebClient и HTTPWebRequest в .NET?

    Как автоматически перезагрузить файлы в Node.js?

    Невозможно вставить gnome-терминал из Keepas2, запущенного через моно

    Как добавить 1 день к NSDate?

    Каталог и папка

    Возврат JsonObject с помощью @ResponseBody в SpringMVC

    Как разархивировать файлы программно в Android?

    Почему / когда было бы целесообразно переопределить ToString?

    Как class может иметь свой собственный тип, это не бесконечная recursion?

    Как заставить Firefox проверять наличие новой версии страницы (browser.cache.check_doc_frequency не работает)?

    Как получить RTM Windows 8 без учетной записи MSDN?

    Я пытаюсь найти поблизости такие места, как банки, рестораны, банкоматы внутри рисованной области на картах Google в андроиде

    Сделать Android WebView не хранить cookies или пароли

    Преобразование и форматирование даты в JSP

    Давайте будем гением компьютера.