【问题标题】:How to JSON encode a hash?如何对哈希进行 JSON 编码?
【发布时间】:2011-09-09 06:47:22
【问题描述】:

我想在服务器端迭代哈希,并使用 JSON 按排序顺序将其发送到客户端。

我的问题是:

当我在我的foreach-loop 中并且拥有键和复杂值(查看底部的哈希值)时,如何将其插入 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' => {
                     ...

【问题讨论】:

  • 听起来您正在尝试使用特定顺序的键生成 JSON 对象。 JSON 规范明确指出对象是无序的,因此无法保证您会以相同的顺序将它们从 JSON 中取出……这使得练习看起来毫无意义。
  • @Quentin:我不知道。谢谢。如何按我指定的顺序发送散列中的数据?
  • 你不能。如果顺序很重要,请使用数组而不是哈希。 (虽然它可以是一个 hashrefs 数组)。

标签: perl json hash


【解决方案1】:

而 JSON 内置排序还不够?

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

仅 JSON:PP 支持排序(Perl,而不是 XS - AFAIK)

所以:

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-&gt;sort_by(sub { $JSON::PP::a cmp $JSON::PP::b })-&gt;encode($obj);这个例子$pc是什么?我想$JSON 在我的情况下是$json
  • $JSON::PP::a cmp $JSON::PP::b 提供字符串排序。 IE。 100 在 44 之前。是否可以进行数字排序,所以 44 在 100 之前?
【解决方案2】:

旧帖子,但任何人都在寻找排序 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?没有意见?
猜你喜欢
  • 2018-02-22
  • 2017-05-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-05-06
  • 2010-10-16
  • 1970-01-01
相关资源
最近更新 更多