Beefy Boxes and Bandwidth Generously Provided by pair Networks
Think about Loose Coupling
 
PerlMonks  

JSON and Perl Objects - How to access data?

by harryhalpin (Initiate)
on Nov 18, 2007 at 22:15 UTC ( #651544=perlquestion: print w/ replies, xml ) Need Help??
harryhalpin has asked for the wisdom of the Perl Monks concerning the following question:

I can convert my data from JSON to objects using the Perl JSON module (http://search.cpan.org/dist/JSON/), but I am having difficulty accessing the data in perl objects. The data appears to be in an array of hashes, but I cannot use any object accessor functions to get at the data. Here's a sample of the data:
{ "items" : [ { "name" : "Theodor Nelson", "id": "_333301" }, { "name": "Morton Heilig", "id": "_13204" } ] }
Here's a snippet of my code. Note $inventors_obj holds the data.
$inventors_obj = jsonToObj($inventors_json[0]); #I want to iterate through my list of inventors @inventors_array = $inventors_obj->{"items"};
But $inventors_obj->{"items} appears to be returning a single object, rather than an array. How can iterate through it, change things, and print it back to JSON?
#print name doesn't work, because the entire object is #stored at $inv +entors_array[0]. print $inventors_array[0]->{"name"} #So this doesn't work: print $inventors_array[1]->{"name"} #I am not sure if this is possible to even alter data #generically wit +h objects, even though I thought they were #really just arrays of hashes: $inventors_array[1]->{"name"} = "New Name"; #But I can do with an array of hashes... $inventors_array[1]{"name"} = "New Name";
However, if I convert the object to an array of hashes (how do I do this, "unblessing"?), can I get it back out in JSON? Is there a way I can manipulate it while keeping it as an object?

Comment on JSON and Perl Objects - How to access data?
Select or Download Code
Re: JSON and Perl Objects - How to access data?
by jZed (Prior) on Nov 18, 2007 at 22:42 UTC
    The structure is a hashref that contains a single member with key "items" which consists of an arrayref that contains two hashrefs. So you have to dereference the arrayref to get its members something like this:
    for my $item( @{$inventors_object->{items}} ){ print $item->{name} . "\n"; };
    To change the data:
    $inventors_object->{items}->[0}->{name} = 'new name';
    To turn it back into a JSON string:
    my $new_json = objToJson( $inventors_object );
    update here is your mistake:
    @inventors_array = $inventors_obj->{"items"};
    You are trying to turn an arrayref into an array without dereferencing it. Instead you want:
    @inventors_array = @{ $inventors_obj->{"items"} };
      Man... thanks a lot.. i am trying to find useful info abt JSON and perl and this is pretty much the only one with some practical information. I still have not understood it completely but my sincere thanks. can u explain it to me wat exactly happens when u convert from json to perl obj. im lost in all the hashref and arrayref you are talking abt. Is it the object's structure that you are talking abt? if you could enumerate i would be grateful. thanks
Re: JSON and Perl Objects - How to access data?
by stvn (Monsignor) on Nov 19, 2007 at 04:00 UTC

    You might want to give MooseX::Storage a look, it is a pretty thorough serialization framework and the JSON backend is pretty thorough (we use it extensively at $work).

    -stvn

Log In?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://651544]
Approved by ww
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others chilling in the Monastery: (23)
As of 2014-07-30 14:29 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    My favorite superfluous repetitious redundant duplicative phrase is:









    Results (234 votes), past polls