Serializzazione di più proprietà DateTime nella stessa class utilizzando diversi formati per ognuno

Ho una lezione con due proprietà DateTime. Ho bisogno di serializzare ciascuna proprietà con un formato diverso. Come posso farlo? Provai:

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

Questa soluzione non funziona per me perché applica il formato della data a tutte le proprietà. C’è un modo per serializzare ogni proprietà DateTime con un formato diverso? Forse c’è qualche attributo?

NewtonSoft.Json ha una struttura che è un po ‘difficile da capire, puoi usare qualcosa come il seguente convertitore personalizzato per fare quello che vuoi:

 [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(); } } 

Un modo semplice per gestire questa situazione è creare una sottoclass di IsoDateTimeConverter per creare un convertitore di date personalizzato per ogni formato di data diverso di cui hai bisogno. Per esempio:

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

Quindi puoi utilizzare l’attributo [JsonConverter] per decorare le singole proprietà DateTime in tutte le classi che richiedono una formattazione personalizzata:

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

demo:

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

Produzione:

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

È ansible creare una class data personalizzata che eredita l’object IsoDateTimeConverter e passare un formato sul costruttore. Sugli attributi, è ansible specificare quale formato corrisponde a ciascuna proprietà. Vedi il codice qui sotto:

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

Mi rendo conto che questa è una vecchia domanda, ma mi sono imbattuto in esso durante la mia ricerca per la stessa domanda.

Newtonsoft ha ora una proprietà DateFormatString nella class JsonSerializerSettings che è ansible utilizzare. Sono arrivato a questa domanda cercando la risposta e ho appena trovato la proprietà, l’ho usata come sotto e funziona come di seguito:

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

Quando il value avrà un object DateTime, lo convertirà in stringa rispettando la stringa _StrDateFormat .

Forse questo link ufficiale può essere aggiornato?

Saluti.