Custom DateTime Converter con Json.NET per gestire formati non-standard, empty string e valori null

Custom DateTime Converter con Json.NET per gestire formati non-standard, empty string e valori null

Indice dei contenuti

La corretta gestione delle date e dei loro molteplici formati è da sempre una delle più grandi seccature per qualsiasi sviluppatore abituato a lavorare in un contesto multi-language, soprattutto quando si lavora con formati di interscambio dati basati su stringhe di testo come XML, CVS o Json. Fortunatamente per chi lavora in ambiente .NET esistono numerose librerie native e di terze parti che consentono di gestire in modo automatico la maggior parte di queste problematiche: per quanto riguarda Json la più nota - e a mio avviso la migliore - è senza ombra di dubbio Json.NET di Newtonsoft, che grazie ai suoi metodi SerializeObject e DeserializeObject consente di convertire intere classi in formato Json e viceversa senza alcuna fatica.

Per una guida all'utilizzo di quest'ottimo prodotto gratuito vi rimando alla documentazione ufficiale, ricca di esempi e demo di facile comprensione. In questo articolo, dando per scontato che sappiate già come utilizzare questo utilissimo strumento, tratterò una problematica specifica, ovvero come fare per de-serializzare correttamente una stringa di input in formato JSON contenente una o più date scritte in formati diversi tra loro, inserite come stringa vuota o comunque differenti rispetto ai formati standard.

Il Problema

Prendiamo ad esempio il seguente JSON:

Come si può vedere, abbiamo una serie di situazioni piuttosto complesse da gestire: date scritte in formati diversi (yyyyMMdd e yyyy/MM/dd) e date non presenti che vengono fornite come empty string e/o come null. Ipotizziamo ora di dover de-serializzare questo JSON nella seguente classe C#:

Come si può vedere, la classe MyDates presenta quattro proprietà: due DateTime, relative ai due campi data sempre presenti nel JSON, e due DateTime? (o DateTime nullabili), così da gestire i campi JSON che possono essere valorizzati oppure no.

Se provassimo a utilizzare Json.NET per de-serializzare in questa classe il JSON di cui sopra, riceveremmo il seguente errore:

ERROR: System.FormatException: String was not recognized as a valid DateTime.

Il motivo è molto semplice: sia le date inserite nei rispettivi formati non-standard quanto quella presente come empty string non possono essere convertite dal DateTimeConverter predefinito, che si aspetta una stringa in formato Date(1198908717056)  come possibile rappresentazione di una data.

La Soluzione

Il modo più efficace per risolvere efficacemente il problema è quello di dotarsi di un CustomDateTimeConverter, ovvero una classe che contenga delle regole precise per convertire nel modo corretto tutte le varie "tipologie" di data che contengono i JSON che ci interessa de-serializzare: formati arbitrari, empty string, valori null e potenzialmente qualsiasi altra cosa.

Quella che segue è la classe che ho messo a punto nella maggior parte dei miei progetti, progettata proprio per risolvere i problemi di cui sopra.

Una volta aggiunta questa classe al vostro progetto all'interno di un file CustomDateTimeConverter.cs potrete utilizzarla nel seguente modo:

La classe è impostata per accettare alcuni tra i formati di input più comuni e trattare le empty string alla stregua di valori nullNel caso in cui vogliate gestire altri formati o modificare la gestione delle stringhe vuote potete utilizzare il costruttore esteso e specificarle volta per volta oppure, se preferite, modificare le variabili statiche relative ai valori predefiniti in fase di inizializzazione della vostra applicazione.

Per il momento è tutto... felice (de)serializzazione!

About Ryan

IT Project Manager, Web Interface Architect e Lead Developer di numerosi siti e servizi web ad alto traffico in Italia e in Europa. Dal 2010 si occupa anche della progettazione di App e giochi per dispositivi Android, iOS e Mobile Phone per conto di numerose società italiane. Microsoft MVP for Development Technologies dal 2018.

View all posts by Ryan

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *


The reCAPTCHA verification period has expired. Please reload the page.

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.