Skip to main content
Ben Nadel at the New York ColdFusion User Group (Dec. 2008) with: Clark Valberg and Michael Dinowitz
Ben Nadel at the New York ColdFusion User Group (Dec. 2008) with: Clark Valberg Michael Dinowitz

Javascript Object Notation (JSON) Kinky-Style

By
Published in , , Comments (2)

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

1 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

15,902 Comments

@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 :)

I believe in love. I believe in compassion. I believe in human rights. I believe that we can afford to give more of these gifts to the world around us because it costs us nothing to be decent and kind and understanding. And, I want you to know that when you land on this site, you are accepted for who you are, no matter how you identify, what truths you live, or whatever kind of goofy shit makes you feel alive! Rock on with your bad self!
Ben Nadel