Hello, I don't know if this exists already, but I needed a way to serialize an entire rose object tree into json. To do this, I created the below methods in my base Rose::DB::Object class.
I can then use this to serialize the entire object tree by doing: my $json = JSON::Syck::Dump($rose_object->object_as_data_structure); Hopefully this will be useful to some. This isn't limited to json of course, the returned value from object_as_data_structure is just a hashref of the rose object (including any loaded relationships) with all references removed. It is a work in progress. It may not handle all column types. Here's the code: =head2 object_as_data_structure Returns a hashref of the rose object in a serializable form. All references are removed. The returned data structure is a copy of the object's values and so will not be updated when the rose object itself is updated. =cut sub object_as_data_structure { my ($self) = @_; my $data = {}; $self->_process_object_as_data_structure($self, $data); return $data; } sub _process_object_as_data_structure { my ($self, $object, $data) = @_; my $meta = $object->meta; my $object_type = ref($object); #warn "object_as_data_structure: processing $object_type"; # add the column values foreach my $col ( $meta->column_names ) { my $value = $object->$col(); my $type = ref($value); # got back a string/number, just add it to the $data if ( ! $type ) { #warn "object_as_data_structure -- col: $col, value: $value"; $data->{$col} = $value; } # this is an object elsif ( $type !~ /^(SCALAR|ARRAY|HASH|CODE|REF|GLOB|LVALUE)$/ ) { #warn "object_as_data_structure -- col: $col, type: $type"; # this is a date field if ( $type eq 'DateTime' ) { my $real_value = $value->ymd . ' ' . $value->hms; #warn "object_as_data_structure -- col: $col, value(from DateTime): $real_value"; $data->{$col} = $real_value; } # try to get the text value from the ->name method elsif ( $value->can('name') ) { my $name = $value->name; my $real_value = $value->$name(); my $real_type = ref($real_value); if ( !$real_type ) { #warn "object_as_data_structure -- col: $col, value(from ->$name): $real_value"; $data->{$col} = $real_value; } else { #warn "object_as_data_structure -- col: $col, cannot determine the value of $real_type objects"; } } else { #warn "object_as_data_structure -- col: $col, unknown data type: $type"; } } else { #warn "object_as_data_structure -- col: $col, cannot determine the value of $type objects"; } } # add any loaded relationships foreach my $rel ( $meta->relationships ) { my $rel_name = $rel->name; if ( $object->has_loaded_related($rel_name) ) { $data->{$rel_name} = {}; $self->_process_object_as_data_structure($object->$rel_name, $data->{$rel_name}); } } } - Ken (perl--AT--xev--DOT--net) ------------------------------------------------------------------------- SF.Net email is sponsored by: Check out the new SourceForge.net Marketplace. It's the best place to buy or sell services for just about anything Open Source. http://sourceforge.net/services/buy/index.php _______________________________________________ Rose-db-object mailing list Rose-db-object@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/rose-db-object