[Dancer-users] storing JSON in a db for later use

Puneet Kishor punk.kish at gmail.com
Sun Dec 26 05:49:25 CET 2010


Actually, I had pursued this problem a while back on this list, received 
helpful suggestions, implemented a solution, and all was working. 
Except, recently (a few days ago) when it stopped working. I can't quite 
pinpoint what caused the program to break, but I am now writing to 
elicit suggestions afresh so I can create a robust solution.

I am deploying all the nice touches that Dancer offers, namely,

	use Dancer::Serializer::Mutable;
	use Dancer::Plugin::REST;
	prepare_serializer_for_format;

I have a longish JSON object in the browser that I stringify and send 
back to the server with the help of jQuery. I store this string into a 
sqlite db. The string looks like


[{"data":"{"year":"1900","harvest_area":"126800.00", .. (very long string)

At a later time, I retrieve the above value, send it back to the browser 
where it is reconstructed back into a JSON object which can be used. 
Except, ever since I started using the automatic serializer, the darn 
thing has stopped working. The JSON object is not fully reconstructed. 
The above string is received by the browser as

[{"data":"{\"year\":\"1900\",\"harvest_area\":\"126800.00\", .. (very 
long string)

The automatically generated headers received are

Request Header
--------------
Accept:application/json, text/javascript, */*; q=0.01

Response Header
--------------
Content-Type:text/xml; charset=UTF-8


I think it is those escaped double quotes in the response (\"year\") are 
creating trouble for me. The value of the "data" key in the JSON object 
should be another dataset, but comes off as a string instead.

As I said above, this was working when I didn't use the automatic 
serializers (D::S::Mutable and D::P::REST with 
`prepare_serializer_for_format`). I used to retrieve the values from the 
db, transform them with from_json() to a Perl data structure, created a 
data structure to return, convert it to a string with to_json() and send 
it back to the browser.

     $sth = __PACKAGE__->SUPER::db()->prepare(qq{
         SELECT id, name, data, poly
         FROM foo
     });
     $sth->execute;

     my @str = ();
     while (my ($id, $name, $data, $poly) = $sth->fetchrow_array) {
         push @str, {
             id   => $id,
             name => $name,
             data => from_json($data),
             poly => from_json($poly)
         }
     }

     return to_json(\@str);

Now I don't use the from_json() and the to_json() calls. Needless to 
say, if I use those calls, I get an error on the server side that

{"error":"malformed JSON string, neither array, object, number, string 
or atom, at character offset 0 (before \"(end of string)\") at (eval 64) 
line 163.\n"}

and, if I don't use from_json() and to_json(), I get

[{"data":"{\"year\":\"1900\",\"harvest_area\":\"126800.00\", ..

which stops my application on the browser side.

So, I am stuck.

If the above is too confusing, I ask this simple question --

How do I reliably send a stringified JSON object to Dancer (I use the 
canonical json2.js from Crockford's site), store it in a sqlite table, 
retrieve it, have Dancer stringify it, send it back to the browser, and 
reconstruct the original JSON object 100%? I want round-trip browser to 
db back to the browser.

Suggestions?



-- 
Puneet Kishor http://punkish.org
Carbon Model http://carbonmodel.org
Charter Member, Open Source Geospatial Foundation http://www.osgeo.org
Science Fellow http://creativecommons.org/about/people/fellows#puneetkishor
Nelson Institute, UW-Madison http://www.nelson.wisc.edu
---------------------------------------------------------------------------
Assertions are politics; backing up assertions with evidence is science
===========================================================================


More information about the Dancer-users mailing list