如何对散列进行JSON编码?

7
我希望在服务器端遍历哈希表,并使用JSON以排序的方式将其发送到客户端。
我的问题是:当我在我的foreach循环中拥有关键字和复杂值(请参见下方哈希表的样式)时,如何将其插入到JSON字符串中?
以下是我的操作方式:
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 的输出结果如下:

$VAR1 = {
          '127' => {
                     'owners' => [
                                   'm'
                                 ],
                     'users' => [
                                  'hh',
                                  'do'
                                ],
                     'date_end' => '24/05-2011',
                     'title' => 'dfg',
                     'date_begin' => '24/05-2011',
                     'members_groups' => [],
                     'type' => 'individuel'
                   },
          '276' => {
                     ...

7
听起来你正在尝试按特定顺序生成一个 JSON 对象。JSON 规范明确指出对象是无序的,因此不能保证你从 JSON 中获取它们的顺序与原来相同...这使得这个练习似乎相当毫无意义。 - Quentin
@Quentin:我完全不知道。谢谢您。我如何按照指定的顺序发送哈希中的数据? - Sandra Schlichting
2
你不能这样做。如果顺序很重要,使用数组而不是哈希表(虽然它可以是哈希引用的数组)。 - Quentin
2个回答

9

JSON的内置排序功能不够吗?

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

只有使用JSON:PP(Perl,不是XS - 据我所知)才支持排序。

因此:

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";

很有可能。我不太理解这个例子$js = $pc->sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })->encode($obj);中的$pc是什么?我猜$JSON在我的情况下应该是$json吧? - Sandra Schlichting
$JSON::PP::a cmp $JSON::PP::b 给出字符串排序。例如,100在44之前。是否可以进行数字排序,使得44在100之前? - Sandra Schlichting

1

虽然这篇文章有点过时,但是如果有人想要对json输出进行排序..

#!/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
   }
}

为什么是-1?没有评论吗? - Jason

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接