[dancer-users] Returning JSON Data
Robert Smith
spamfree at wansecurity.com
Mon Sep 28 16:54:26 BST 2015
Dear Russel, please see additional information below. I really appreciate your help.
> On Sep 27, 2015, at 10:41 PM, Russell Jenkins <russell.jenkins at strategicdata.com.au> wrote:
>
> On 27/09/2015 11:54 am, Robert Smith wrote:
>> JSON is enabled in config.yml
>>
>> serializer: "JSON"
>> engines:
>> serializer:
>> JSON:
>> pretty: 1
>> allow_blessed: 1
>> canonical: 0
>> utf8: 1
>>
>> YAML is working fine as a serializer using the the following method:
>> JSON prints mojibake when using the serializer using the following method:
>>
>>
>> get '/establishments' => sub {
>> my $sql = 'select * from establishments';
>> my $sth = database->prepare($sql) or die database->errstr;
>> $sth->execute or die $sth->errstr;
>> #the following is broken in Dancer2
>> return \%{$sth->fetchall_hashref('id')};
>> };
>>
>
>
> Provided you get characters (not octets) back from the database the above "just works".
> If you are getting octets back they will get encoded again (with their default serializer params).
> All Dancer2 serializers expect characters and return octets for adding to the response body.
>
It doesn’t "just work” however it seems. If this was true, shouldn’t the YAML serializer be having the same issue? Whatever my database is returning works perfectly fine with the YAML serializer, but not the JSON serializer.
Here is my config.yml
appname: "BeaconTrackerAPI"
layout: "main"
charset: "UTF-8"
serializer: "JSON"
engines:
serializer:
JSON:
pretty: 1
allow_blessed: 1
canonical: 0
# ascii: 1
#utf8: 1
template: "simple"
plugins:
Database:
driver: 'Pg'
database: ‘***************'
host: 'localhost'
port: 5432
username: ‘*******'
password: '********'
connection_check_threshold: 10
on_connect_do: ["SET NAMES 'utf8'"]
Here is the method used in both the JSON and YAML tests:
get '/establishments' => sub {
my $sql = 'select * from establishments';
my $sth = database->prepare($sql) or die database->errstr;
$sth->execute or die $sth->errstr;
#return to_json(\%{$sth->fetchall_hashref('id')}, { utf8 => 0 });
#the following is broken in Dancer2 serializer
return \%{$sth->fetchall_hashref('id')};
};
Here is the output to the browser (broken):
{
"1" : {
"client_id" : "1123",
"name" : "WANSecurity, K.K.",
"address" : "æ±äº¬éƒ½æ¸‹è°·åŒºä¸ŠåŽŸï¼’−48−12 ã¨ã‚ˆä»£ã€…木上原コーãƒï¼ƒï¼’ï¼ï¼‘",
"id" : "1"
}
}
Here is output from my terminal via psql (Looks good):
beacon_tracker=> select * from establishments;
id | name | address | client_id
----+-------------------+-----------------------------------------------------------+-----------
1 | WANSecurity, K.K. | 東京都渋谷区上原2−48 | 1123
Is this the expected behavior?
Here is the output from YAML when using the YAML serializer (Looks good):
---
1:
address: 東京都渋谷区上原2−48
client_id: 1123
id: 1
name: 'WANSecurity, K.K.'
YAML looks exactly like what I would expect to see, right out of the box. Something strange is happening with the JSON serializer it seems.
Am I missing anything?
-Robert
>
> Note the #686 is about a different issue; the to_json, to_yaml and to_dumper keywords.
> Their implementation also returns octets, so when those keywords are used as the return
> form a route the response is double encoded.
>
>
> Hope that helps,
> Russell.
>
> _______________________________________________
> dancer-users mailing list
> dancer-users at dancer.pm
> http://lists.preshweb.co.uk/mailman/listinfo/dancer-users
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.preshweb.co.uk/pipermail/dancer-users/attachments/20150929/c674683d/attachment-0001.html>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: Screen Shot 2015-09-29 at 12.47.23 AM.png
Type: image/png
Size: 46238 bytes
Desc: not available
URL: <http://lists.preshweb.co.uk/pipermail/dancer-users/attachments/20150929/c674683d/attachment-0001.png>
More information about the dancer-users
mailing list