Re: [Catalyst] Cross-link: How do I turn Moose objects into JSON for use in Catalyst?

2010-08-04 Thread Tomas Doran


On 3 Aug 2010, at 17:31, Evan Carroll wrote:


I've posted a question and a few possible fixes. Does anyone have
anything to add here? How do you go about dumping Moose to JSON in
Cat?


I use MooseX::Storage, as per perigrin's comment on the stack overflow  
post.


Cheers
t0m


___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


[Catalyst] Cross-link: How do I turn Moose objects into JSON for use in Catalyst?

2010-08-03 Thread Evan Carroll
I've posted a question and a few possible fixes. Does anyone have
anything to add here? How do you go about dumping Moose to JSON in
Cat?

http://stackoverflow.com/questions/3391967/how-do-i-turn-moose-objects-into-json-for-use-in-catalyst

-- 
Evan Carroll - m...@evancarroll.com
System Lord of the Internets
web: http://www.evancarroll.com
ph: 281.901.0011

___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] Cross-link: How do I turn Moose objects into JSON for use in Catalyst?

2010-08-03 Thread Alex J. G. BurzyƄski
Hi,

On 03/08/10 16:31, Evan Carroll wrote:
 I've posted a question and a few possible fixes. Does anyone have
 anything to add here? How do you go about dumping Moose to JSON in
 Cat?

 http://stackoverflow.com/questions/3391967/how-do-i-turn-moose-objects-into-json-for-use-in-catalyst

   

That's the method I'm using to dump my classes for AJAX-driven control
panel.

Works recursively on my other moose classes (ResultSet::* classes from
DBIx::BlackBox consume MyApp::DB::ResultSet::Roles::ToJSON).

Cheers,
Alex


package MyApp::DB::ResultSet::Roles::ToJSON;

use Moose::Role;

sub TO_JSON {
my $self = shift;

my $json_hash = {};

for my $attr ( $self-meta-get_all_attributes ) {
my $name = $attr-name;
$json_hash-{ $name } = $self-$name;
}

return $json_hash;
}
 
package MyApp::DB::ResultSet::SuppliersList;

use Moose;

with qw(
MyApp::DB::ResultSet::Roles::ToJSON
); 
   
use namespace::autoclean;
   
has 'org_id' = (
is = 'rw',
isa = 'Str',
required = 1,
);
has 'org_name' = (
is = 'rw',
isa = 'Str',
required = 1,
);
has 'number_of_courses' = (
is = 'rw',
isa = 'Int',
default = 0,
required = 1,
); 
has 'number_of_enabled_courses' = (
is = 'rw',
isa = 'Int',
default = 0,
required = 1,
);


package MyApp::View::JSON;

use strict;
use base 'Catalyst::View::JSON';

use JSON::XS ();

my $encoder = JSON::XS
-new
-utf8
-pretty(0)
-indent(0)
-allow_blessed(1)
-convert_blessed(1);
   
sub encode_json {
my($self, $c, $data) = @_;

$encoder-encode($data);
}

package MyApp::Controller::Foo;
...

sub list_suppliers :Local {
my ( $self, $c ) = @_;

$c-stash( json = []);

my $rs = $c-model('DB')-exec('ListSuppliers');
do {
while ( my $supplier = $rs-next_row ) {
push @{ $c-stash-{json} }, $supplier;
}
} while ( $rs-next_resultset );

$c-forward('View::JSON');
}

___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] Cross-link: How do I turn Moose objects into JSON for use in Catalyst?

2010-08-03 Thread Evan Carroll
 The documentation  isn't clear on how, but this implies some combination of
 these flags (probably setting both to true) should do the encoding the
 reference as if it weren't blessed thing.

No, allow_blessed(1) means it will not die, it will instead print out
the totally useless string 'null'. This is technically allowing a
blessed scalar. However, convert_blessed, is a total misnomer as
nothing is /converted/. All that happens is the method TO_JSON is
called.

ecarr...@rda:~$ perl -MJSON::XS -E'my $o = bless { foo='bar' }; say
JSON::XS-new-encode( $o );'
encountered object 'main=HASH(0x7b8df0)', but neither allow_blessed
nor convert_blessed settings are enabled at -e line 1.

ecarr...@rda:~$ perl -MJSON::XS -E'my $o = bless { foo='bar' }; say
JSON::XS-new-allow_blessed(1)-encode( $o );'
null
ecarr...@rda:~$ perl -MJSON::XS -E'my $o = bless { foo='bar' }; say
JSON::XS-new-allow_blessed(1)-convert_blessed(1)-encode( $o );'
null

In this example the object is blessed in the default package main,
where TO_JSON is called.

ecarr...@rda:~$ perl -MJSON::XS -E'my $o = bless { foo='bar' }; sub
TO_JSON { hi }; say
JSON::XS-new-allow_blessed(1)-convert_blessed(1)-encode( $o );'
hi


But yes, ideally /convert_blessed/ would do what I want rather than
just call a sub that expects me to do it. My handy old XXX.pm does
this right:

ecarr...@rda:~$ perl -E'my $o = bless { foo='bar' }; use XXX; XXX $o'
--- !!perl/hash:main
foo: bar
...
  at -e line 1

-- 
Evan Carroll - m...@evancarroll.com
System Lord of the Internets
web: http://www.evancarroll.com
ph: 281.901.0011

___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] Cross-link: How do I turn Moose objects into JSON for use in Catalyst?

2010-08-03 Thread Evan Carroll
On Tue, Aug 3, 2010 at 12:34 PM, Stuart Watt sw...@infobal.com wrote:
 You're right - I just checked the sources and there is no valid code for
 this case, despite the implication of the documentation. I'd be tempted to
 file a bug against JSON::XS, as at least the pod is wrong. I guess it got
 too hard, as blessedness does not require a thing to be a hashref. Looks
 like a fairly straightforward test case and patch, though.

I filed a bug report (feature request) for real object dumping
https://rt.cpan.org/Ticket/Display.html?id=60050

-- 
Evan Carroll - m...@evancarroll.com
System Lord of the Internets
web: http://www.evancarroll.com
ph: 281.901.0011

___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/


Re: [Catalyst] Cross-link: How do I turn Moose objects into JSON for use in Catalyst?

2010-08-03 Thread Evan Carroll
It also appears as if YAML::Syck does this very well:

perl -MJSON::Syck -MURI -E'say JSON::Syck::Dump( bless { foo =
URI-new(http://www.evancarrol.com;) } )'

-- 
Evan Carroll - m...@evancarroll.com
System Lord of the Internets
web: http://www.evancarroll.com
ph: 281.901.0011

___
List: Catalyst@lists.scsys.co.uk
Listinfo: http://lists.scsys.co.uk/cgi-bin/mailman/listinfo/catalyst
Searchable archive: http://www.mail-archive.com/catalyst@lists.scsys.co.uk/
Dev site: http://dev.catalyst.perl.org/