Well there are a few things at play, here. First of all, are you aware that Taffy has queryToArray() and queryToStruct() helper methods available in your resources? These will both preserve column name case to whatever you use in your select statement.
return rep( queryToArray( q ) ).withStatus( 200, "OK" );
return rep( queryToStruct( q ) ).withStatus( 200, "OK" );
Secondly, the string -> numeric thing is a bug in ColdFusion's serialization functions. You may find that
JSONUtil will do a better job, and there is some information on integrating it with Taffy
here.
Lastly, the simplest hack to make it remain a string would be to prepend a non-numeric character that you strip out on the client-side after the response is received.
select concat('@', column) as column from table
This will stop CF from thinking your numeric string should be a numeric value in the data -- but it's a horrible, horrible kludge of a hack that I would only recommend if you're in a big hurry and nobody else will ever be consuming the API (e.g. private, not public).
Good luck! Let us know how you do...