Date objects in JSON

Flavio of MongoDB fame complained in a tweet about wanting a date format in JSON. Currently you can only express strings and numbers as the primitive data types in JSON, as well the composite forms of a list: [] and an object: {}. The latter is essentially just a subhierarchy in the object/array that is your full JSON document.

i wonder why there's no "STANDARD" way to (de)serialize times / date times into / from json! They might not be "primitive" but COME ON!!

— FlaPer87 (@flaper87) July 20, 2012

My response:

@flaper87 Going back to basics: is there a json-like string that you can eval() and get a JS Date object?

— Henrik Ingo (@h_ingo) July 20, 2012

What did I mean by that?

Json serialization was originally invented in JavaScript circles. The point of the Json format is that it is valid JavaScript syntax. Originally, de-serialization was done with the eval() function:


<script type="text/javascript">
var jsondoc = '{"hello" : "world", "foo" : "bar", "nr" : 1 }'
var obj;
eval("obj = " + jsondoc);
</script>

So my point is, whatever date-format you want to standardize for Json, it needs to at least be valid JavaScript syntax, so that a user could eval() the string and actually get a Date() object. Something like a simple:


var d = new Date("2012-07-22T19:49:00");

In fact, that is perfectly possible (tested on Firefox) to put into a json-like string:


<!DOCTYPE html>
<html>
<body>

<h1>Demo

<p id="one">A Paragraph.
<p id="two">A Paragraph.
<p id="three">A Paragraph.
<p id="four">A Paragraph.
<p id="five">A Paragraph.
<p id="six">A Paragraph.
<p id="seven">A Paragraph.

<script type="text/javascript">

var d;
d = new Date("2012-07-22T19:49:00");

var jsondoc = '{"hello" : "world", "foo" : "bar", "nr" : 1, "timestamp" : "2012-07-22T19:49:00", "dateobj_ref" : d, "dateobj_inline" : new Date("2012-07-22T19:49:00") }'
var obj;
eval("obj = " + jsondoc);

document.getElementById("one").innerHTML=obj.hello;
document.getElementById("two").innerHTML=obj.foo;
document.getElementById("three").innerHTML=obj.nr;
document.getElementById("four").innerHTML=obj.timestamp;
document.getElementById("five").innerHTML=obj.dateobj_ref;
document.getElementById("six").innerHTML=obj.dateobj_inline;
document.getElementById("seven").innerHTML=d;
</script>

</body>
</html>

So there you have it. The JSON notation for a date type needs to be simply:


jsondate = '{ "dateobj" : new Date("2012-07-22T19:49:00") }'

Epilogue

It turns out at least newer versions of Firefox JavaScript also support a newer Date.toJSON() function that will return a string like 2012-07-22T16:49:00.000Z. How this is supposed to be JSON I don't really know. If I would put that in the place of a value in a json document, it is not valid JavaScript syntax. If I put it into quotes, it of course becomes a string.

But the new Date(...) approach actually works.

About the bookAbout this siteAcademicAccordAmazonAppleBeginnersBooksBuildBotBusiness modelsbzrCassandraCloudcloud computingclsCommunitycommunityleadershipsummitConsistencycoodiaryCopyrightCreative CommonscssDatabasesdataminingDatastaxDevOpsDistributed ConsensusDrizzleDrupalEconomyelectronEthicsEurovisionFacebookFrosconFunnyGaleraGISgithubGnomeGovernanceHandlerSocketHigh AvailabilityimpressionistimpressjsInkscapeInternetJavaScriptjsonKDEKubuntuLicensingLinuxMaidanMaker cultureMariaDBmarkdownMEAN stackMepSQLMicrosoftMobileMongoDBMontyProgramMusicMySQLMySQL ClusterNerdsNodeNoSQLNyrkiöodbaOpen ContentOpen SourceOpenSQLCampOracleOSConPAMPParkinsonPatentsPerconaperformancePersonalPhilosophyPHPPiratesPlanetDrupalPoliticsPostgreSQLPresalespresentationsPress releasesProgrammingRed HatReplicationSeveralninesSillySkySQLSolonStartupsSunSybaseSymbiansysbenchtalksTechnicalTechnologyThe making ofTransactionsTungstenTwitterUbuntuvolcanoWeb2.0WikipediaWork from HomexmlYouTube