Specifica di un formato DateTime personalizzato durante la serializzazione con Json.Net

Sto sviluppando un’API per esporre alcuni dati utilizzando l’API Web ASP.NET.

In una delle API, il cliente ci chiede di esporre la data nel formato yyyy-MM-dd . Non voglio modificare le impostazioni globali (ad esempio GlobalConfiguration.Configuration.Formatters.JsonFormatter ) per questo poiché è molto specifico per questo client. E lo sviluppo in una soluzione per più clienti.

Una delle soluzioni che potrei pensare è creare un JsonConverter personalizzato e poi inserirlo nella proprietà che ho bisogno di fare la formattazione personalizzata

per esempio

 class ReturnObjectA { [JsonConverter(typeof(CustomDateTimeConverter))] public DateTime ReturnDate { get;set;} } 

Mi chiedo solo se c’è un altro modo semplice per farlo.

Sei sulla strada giusta. Dato che hai detto che non puoi modificare le impostazioni globali, la prossima cosa migliore è applicare l’attributo JsonConverter come necessario, come suggerito. Risulta che Json.Net ha già un IsoDateTimeConverter che ti consente di specificare il formato della data. Sfortunatamente, non è ansible impostare il formato tramite l’attributo JsonConverter , poiché l’argomento esclusivo dell’attributo è un tipo. Tuttavia, esiste una soluzione semplice: sottoclass l’ IsoDateTimeConverter , quindi specifica il formato della data nel costruttore della sottoclass. Applica l’attributo JsonConverter dove necessario, specificando il tuo convertitore personalizzato e sei pronto per partire. Ecco l’interezza del codice necessario:

 class CustomDateTimeConverter : IsoDateTimeConverter { public CustomDateTimeConverter() { base.DateTimeFormat = "yyyy-MM-dd"; } } 

Se non ti dispiace avere anche lì il tempo, non hai nemmeno bisogno di sottoclassi di IsoDateTimeConverter. Il suo formato data predefinito è yyyy'-'MM'-'dd'T'HH':'mm':'ss.FFFFFFFK (come si vede nel codice sorgente ).

Può anche essere eseguito con un’istanza IsoDateTimeConverter temporanea, senza modificare le impostazioni di formattazione globale:

 string json = JsonConvert.SerializeObject(yourObject, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }); 

Questo usa il sovraccarico che accetta un argomento params JsonConverter[] .

Potresti usare questo approccio:

 public class DateFormatConverter : IsoDateTimeConverter { public DateFormatConverter(string format) { DateTimeFormat = format; } } 

E usalo in questo modo:

 class ReturnObjectA { [JsonConverter(typeof(DateFormatConverter), "yyyy-MM-dd")] public DateTime ReturnDate { get;set;} } 

La stringa DateTimeFormat utilizza la syntax della stringa di formato .NET descritta qui: https://docs.microsoft.com/en-us/dotnet/standard/base-types/custom-date-and-time-format-strings

Disponibile anche utilizzando uno dei sovraccarichi delle impostazioni del serializzatore:

 var json = JsonConvert.SerializeObject(someObject, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" }); 

O

 var json = JsonConvert.SerializeObject(someObject, Formatting.Indented, new JsonSerializerSettings() { DateFormatString = "yyyy-MM-ddThh:mm:ssZ" }); 

Sono disponibili anche sovraccarichi con un tipo.

Crea una class helper e applicala all’attributo della tua proprietà

Classe helper:

 public class ESDateTimeConverter : IsoDateTimeConverter { public ESDateTimeConverter() { base.DateTimeFormat = "yyyy-MM-ddTHH:mm:ss.fffZ"; } } 

Il tuo codice usa questo:

 [JsonConverter(typeof(ESDateTimeConverter))] public DateTime timestamp { get; set; }