skeniver
skeniver

Reputation: 2647

Perl to JSON, with key/value pairs

I am trying to output some data from Perl to JSON. I can do a simple output, but would like to structure it better.

I have an array with an id, a start time and an end time. This is the code I am using to output:

print header('application/json');
my $json->{$entry} = \@array;
my $json_text = to_json($json);
print $json_text;

Which returns:

{"Season":[["1","1330065300","1344038401"],["7","1298505601","1312416001"]]}

But I would like to output something more like:

{"Season":0[{"id":1,"DateStart":1330065300,"DateEnd":1344038401},{"id":7,"DateStart":1298505601,"DateEnd":1312416001}]}

Can anyone help on how to better structure my output?

---UPDATE------

Thanks Michael. I have tried to implement your example.

This is the code at the moment:

foreach my $key (keys %$seasons)
    {
        $seasons->{$key} =
        [
            map
            {
                { id=>$_[0], DateStart=>$_[1], DateEnd=>$_[2] }
            } @{$seasons->{$key}}
        ];
    }

But it returns the error (referring to the foreach line):

Not a HASH reference at line 148

$seasons is an arrayref return from a SQL fetchall_arrayref

Any clues?

Upvotes: 0

Views: 3380

Answers (3)

Michał Wojciechowski
Michał Wojciechowski

Reputation: 2490

You basically want to convert an array of arrays to an array of hashes, and you can do this using map. Assuming $data is your structure, this should do it:

for my $key (keys %$data) {
    $data->{$key} = [
        map {
            { id => $_->[0], DateStart => $_->[1], DateEnd => $_->[2] }
        } @{$data->{$key}}
    ];      
}

Upvotes: 2

David W.
David W.

Reputation: 107090

Whenever you're trying something like this, always check CPAN to see if someone has done it before and not try to reinvent the wheel. I found a module called JSON that seems to do exactly what you want.

There's an example on that page that does exactly what you want. Here's a quick paraphrase:

use JSON; # imports encode_json, decode_json, to_json and from_json.

# simple and fast interfaces (expect/generate UTF-8)
my $utf8_encoded_json_text = encode_json \@array;

Can't get easier than that. The best part is that this will work no matter how complex your array structure gets.

Upvotes: 2

Quentin
Quentin

Reputation: 944568

If you want to output an array of objects with key/value pairs instead of an array of arrays, then put appropriate data into to_json in the first place.

i.e. an array of hashrefs and not an array of arrayrefs.

You can use map to transform the data.

Upvotes: 2

Related Questions