Decodificare le date in un flusso JSON (Python)

JSON-Datetime permette di decodificare i valori [cci lang=”python” theme=”default”]datetime[/cci] normalmente espressi come stringhe in un flusso JSON. E’ davvero molto semplice, e fa parte della suite strumenti open source che sto sviluppando nel contesto del più ampio progetto RESTful Web API.

Del problema della decodifica delle stringhe JSON in valori datetime ho già scritto in passato. Allora proponevo una soluzione algoritmica; ora vi presento un prodotto finito che potete usare nei vostri progetti.

Il problema

Lo standard JSON (RFC 4627) non supporta valori di tipo data/ora. In un flusso JSON le date vengono rappresentate come semplici stringhe che i decoder Python interpretano come tali:

import simplejson as json

>>>test = '{"name": "John Doe", "born": "Thu, 1 Mar 2012 10:00:49 UTC"}'
>>>json.loads(test)
{'name': 'John Doe', 'born': 'Thu, 1 Mar 2012 10:00:49 

Nell’esempio precedente il campo born è una stringa nel JSON, e tale rimane dopo la decodifica in un dizionario Python.

La soluzione

JSON-Datetime è un semplice wrapper attorno al metodo loads di simplejson. Ecco che succede quando usiamo JSON-Datetime al posto di simplejson:

>>> import jsondatetime as json
>>> test = '{"name": "John Doe", "born": "Thu, 1 Mar 2012 10:00:49 UTC"}'

>>> json.loads(test)
{'name': 'John Doe', 'born': datetime.datetime(2012, 3, 1, 10, 0 ,49)}

Ora born assume il valore corretto. Affinché vengano riconosciute, le date contenute nel JSON devono corrispondere a un formato strptime() valido indicato con l’argomento datetime_format. Nell’esempio precedente, poiché l’argomento è assente, viene usato il valore di default '%a, %d %b %Y %H:%M:%S UTC', corrispondente allo standard RFC 1123 (ex 822). Nell’esempio che segue usiamo un formato personalizzato:

>>> import jsondatetime as json
>>> test = '{"name": "John Doe", "born": "Thu, 1 Mar 2012"}'

>>> json.loads(test, datetime_format="%a, %d %b %Y";)
{'name': 'John Doe', 'born': datetime.datetime(2012, 3, 1)}

JSON-Datetime è un semplice wrapper che ci lascia liberi di usare tutti gli argomenti standard previsti per loads, object_hook incluso. Ciò significa che questa soluzione (al contrario di quella proposta in precedenza) ci lascia liberi di applicare qualsivoglia parser al nostro flusso JSON.

Installazione e sorgenti

Per l’installazione basta il classico pip install json-datetime. Il codice è disponibile su GitHub.

Fork me on GitHub
  • http://gabrieleromanato.com/ Gabriele Romanato

    Python ha affrontato e risolto un problema dall’interno dello stesso componente JSON, mentre in PHP, in linea di massima, la stringa ottenuta con json_decode() va passata a date() o alla classe DateTime. Cosa che fra l’altro non ho mai testato. :-)