Ben Nadel
On User Experience (UX) Design, JavaScript, ColdFusion, Node.js, Life, and Love.
I am the chief technical officer at InVision App, Inc - a prototyping and collaboration platform for designers, built by designers. I also rock out in JavaScript and ColdFusion 24x7.
Meanwhile on Twitter
Loading latest tweet...
Ben Nadel at cf.Objective() 2014 (Bloomington, MN) with: Jeff McDowell and Joel Hill and Jonathan Rowny and Shawn Grigson and Jonathan Dowdle and Matt Vickers and Christian Ready and Asher Snyder and Clark Valberg and Oscar Arevalo and David Bainbridge

Javascript Object Notation (JSON) Kinky-Style

By Ben Nadel on

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.



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