How to JSON encode a hash?

10,137

Solution 1

And the JSON builtin sort does not enough?

see: http://metacpan.org/pod/JSON#sort_by

Sorting is supported only with JSON:PP (Perl, not XS - AFAIK)

so:

use JSON::PP;
use warnings;
use strict;

my $data = {
        'aaa' => {
                a => 1,
                b => 2,
        },
        'bbb' => {
                x => 3,
        },
        'a2' => {
                z => 4,
        }
};

my $json = JSON::PP->new->allow_nonref;
#my $js = $json->encode($data); #without sort
my $js = $json->sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })->encode($data);
print "$js\n";

Solution 2

Oldish post but anyone looking for sorting json output..

#!/bin/perl
use warnings;
use strict;
use Sort::Naturally;
use JSON;

my $data = {
    'a10' => {
            b => 1,
            a => 2,
    },
    'bbb' => {
            x => 3,
    },
    'a2' => {
            z => 4,
    }
};
my $json = new JSON;
$json->sort_by(sub { ncmp($JSON::PP::a, $JSON::PP::b) });
my $json_text = $json->pretty->encode ($data);
print $json_text;

{
   "a2" : {
      "z" : 4
   },
   "a10" : {
      "a" : 2,
      "b" : 1
   },
   "bbb" : {
      "x" : 3
   }
}
Share:
10,137
Sandra Schlichting
Author by

Sandra Schlichting

Updated on June 28, 2022

Comments

  • Sandra Schlichting
    Sandra Schlichting almost 2 years

    I would like to iterate over a hash on the server-side, and send it over to the client in the sorted order using JSON.

    My question is:

    When I am in my foreach-loop and have the key and complex value (see how my hash looks like at the bottom), how do I insert it in to the JSON string?

    Here is how I do that

    use JSON;
    my $json = JSON->new;
    $json = $json->utf8;
    
    ...
    
    # use numeric sort
    foreach my $key (sort {$a <=> $b} (keys %act)) {
    
      # somehow insert $key and contents of $act{$key} into JSON here
    
    }
    
    # my $json_string;
    # my $data = $json->encode(%h);
    # $json_string = to_json($data);
    
    # # return JSON string
    # print $cgi->header(-type => "application/json", -charset => "utf-8");
    # print $json_string;
    

    print Dumper \%act looks like this

    $VAR1 = {
              '127' => {
                         'owners' => [
                                       'm'
                                     ],
                         'users' => [
                                      'hh',
                                      'do'
                                    ],
                         'date_end' => '24/05-2011',
                         'title' => 'dfg',
                         'date_begin' => '24/05-2011',
                         'members_groups' => [],
                         'type' => 'individuel'
                       },
              '276' => {
                         ...
    
  • Sandra Schlichting
    Sandra Schlichting almost 13 years
    It is very likely. I don't quite understand the example $js = $pc->sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })->encode($obj); What is $pc? I suppose $JSON is $json in my case?
  • Sandra Schlichting
    Sandra Schlichting almost 13 years
    $JSON::PP::a cmp $JSON::PP::b gives string sort. Ie. 100 comes before 44. Is numerical sort possible, so 44 comes before 100?
  • Jason
    Jason over 8 years
    Why the -1? No comment?