Javascript Object Notation (JSON) Kinky-Style
In an effort to learn AJAX and Javascript Object Notation (JSON), I am converting the CFJSON encoder into something that will fit into my architecture and standards; that's not meant to be snooty, I just have certain coding standards (such as capitalization and white-space utilization) that I like to follow. One of the things that I ended up changing was the conversion of the ColdFusion query to Javascript. The conversion is very interesting. Inherently, CFJSON converts the ColdFusion query into a mirrored Javascript object of arrays. In ColdFusion, if you refer to a query via structure notation, you have to put the column name first, then the row:
qTest[ "id" ][ 5 ]
This seems unnatural to me. I never liked it in ColdFusion and I don't care for it in Javascript. And so, I have converted my ColdFusion queries into Javascript arrays of structures:
qTest[ 5 ].id
This seems a much more natural representation of Javascript data types; however, when I dumped out the results, I can see that not only do they perform differently, they look very different. Take of example the following query:
qTest = QueryNew( "id, name, rating" );
QueryAddRow( qTest );
qTest[ "id" ][ qTest.RecordCount ] = 3;
qTest[ "name" ][ qTest.RecordCount ] = "Sarah";
qTest[ "rating" ][ qTest.RecordCount ] = 9;
QueryAddRow( qTest );
qTest[ "id" ][ qTest.RecordCount ] = 4;
qTest[ "name" ][ qTest.RecordCount ] = "Julia";
qTest[ "rating" ][ qTest.RecordCount ] = 8;
QueryAddRow( qTest );
qTest[ "id" ][ qTest.RecordCount ] = 6;
qTest[ "name" ][ qTest.RecordCount ] = "Kat";
qTest[ "rating" ][ qTest.RecordCount ] = 6;
QueryAddRow( qTest );
qTest[ "id" ][ qTest.RecordCount ] = 9;
qTest[ "name" ][ qTest.RecordCount ] = "Laura";
qTest[ "rating" ][ qTest.RecordCount ] = 4;
QueryAddRow( qTest );
qTest[ "id" ][ qTest.RecordCount ] = 11;
qTest[ "name" ][ qTest.RecordCount ] = "Heather";
qTest[ "rating" ][ qTest.RecordCount ] = 7;
When converted via CFJSON, you get:
{"recordcount":5,"columnlist":"ID,NAME,RATING","data":{"ID":[3,4,6,9,11],"NAME":["Sarah","Julia","Kat","Laura","Heather"],"RATING":[9,8,6,4,7]}}
When converted through my ColdFusion ToJavascript() method, you get:
{"recordcount":5","columnlist":"ID,NAME,RATING","data":{[{"rating":9,"name":"Sarah","id":3},{"rating":8,"name":"Julia","id":4},{"rating":6,"name":"Kat","id":6},{"rating":4,"name":"Laura","id":9},{"rating":7,"name":"Heather","id":11}]}}
My version, while more natural, must transport much more data since the column names are repeated for every "row" of the query. I don't like all the additional transfer, but I do like the way I handle the query conversion. For the moment, I am going to keep my method. I am at peace since I will most likely not be handling such large amounts of data and the size difference should be insignificant. But I can certainly see that with larger data sets, this will quickly add up and become very large.
Want to use code from this post? Check out the license.
Reader Comments
Ben,
Did you modify the CFJSON file. I tend to not want to modify the core files to any framework I use (if I didn't write it).
Joe
@Joe,
With something like this, I tend to write things from the ground up. I am HUGE fan of reinventing the wheel. Plus, I have very specific formatting rules that I like to follow so modifying someone else's file tends to irk me a bit.
Of course, writing from the ground up or any modifications for that matter are much more prone to error :)