package Local::MooseJson; use strict; use warnings; use Moose; use JSON; use namespace::autoclean; around BUILDARGS => sub { my ($orig, $class, @args) = @_; # Validate @args: 1 element only; JSON text my $json_to_perl = decode_json $args[0]; my $new_hashref = {}; for my $key ($class->meta->get_attribute_list()) { $new_hashref->{$key} = delete $json_to_perl->{$key}; } for my $extra_key (keys %$json_to_perl) { warn "IGNORED! Unknown JSON property: '$extra_key'\n"; } return $class->$orig($new_hashref); }; has body_raw => (is => 'ro', isa => 'Str', required => 1); has entry_id => (is => 'ro', isa => 'Int', required => 1); has icon => (is => 'ro', isa => 'HashRef', required => 1); __PACKAGE__->meta->make_immutable; 1; #### #!/usr/bin/env perl use strict; use warnings; use FindBin qw($RealBin); use lib "$RealBin/../lib"; use Local::MooseJson; chomp(my $rest_json = <<'EOJ'); { "body_raw" : "This is Entry 1", "url" : "http://nataraj.nataraj.hack.dreamwidth.net/459.html", "datetime" : "2022-08-20 16:36:00", "Surprise!" : "You didn't expect this.", "entry_id" : 459, "subject_html" : "Entry 1", "poster" : { "display_name" : "nataraj", "username" : "nataraj" }, "icon" : { "url" : "http://www.nataraj.hack.dreamwidth.net/userpic/1/3", "comment" : "4", "picid" : 1, "keywords" : [ "3" ], "username" : "nataraj" }, "subject_raw" : "Entry 1", "body_html" : "This is Entry 1" } EOJ my $mj = Local::MooseJson::->new($rest_json); print 'Username: ', $mj->icon()->{username}, "\n"; #### ken@titan ~/tmp/pm_11146255_moose_json/bin $ ./moose_json.pl IGNORED! Unknown JSON property: 'subject_html' IGNORED! Unknown JSON property: 'url' IGNORED! Unknown JSON property: 'poster' IGNORED! Unknown JSON property: 'subject_raw' IGNORED! Unknown JSON property: 'Surprise!' IGNORED! Unknown JSON property: 'body_html' IGNORED! Unknown JSON property: 'datetime' Username: nataraj #### ken@titan ~/tmp $ ls -lR pm_11146255_moose_json pm_11146255_moose_json: total 0 drwxr-xr-x 1 ken None 0 Aug 21 07:43 bin drwxr-xr-x 1 ken None 0 Aug 21 07:04 lib pm_11146255_moose_json/bin: total 4 -rwxr-xr-x 1 ken None 846 Aug 21 07:43 moose_json.pl pm_11146255_moose_json/lib: total 0 drwxr-xr-x 1 ken None 0 Aug 21 07:40 Local pm_11146255_moose_json/lib/Local: total 4 -rw-r--r-- 1 ken None 788 Aug 21 07:40 MooseJson.pm