生成具有相同键名的哈希的json - perl

a7o*_*ton 0 perl json

我的目标是生成以下json:

{
     "nervous" : {
         { "id" : 1 },
         { "id" : 2 },
         { "id" : 3}
      }
}
Run Code Online (Sandbox Code Playgroud)

我知道哈希不会多次接受同名的密钥,但是有没有办法生成上面的json?目前我正在做以下事情:

use JSON;

sub json_test {

    my %moods;
    $moods{'happy'} = "am happy";
    $moods{'excited'} = "am excited";
    $moods{'nervous'}{'id'} = 2;
    $moods{'nervous'}{'id'} = 3;
    $moods{'nervous'}{'id'} = 4;

    return to_json( \%moods, {utf8 => 1, pretty => 1});
}

my $return = json_test();
print $return;
Run Code Online (Sandbox Code Playgroud)

我很确定它是有效的json数据,因为每个id都在它自己的对象中.有人可以建议,我对Perl完全不熟悉(但我很高兴能够学到它)

amo*_*mon 6

您的JSON无效.对象{…}需要键值对.您可能想要使用数组[…]:

{
     "nervous" : [
         { "id" : 1 },
         { "id" : 2 },
         { "id" : 3}
      ]
}
Run Code Online (Sandbox Code Playgroud)

这可以由Perl代码生成

my $moods = {
     nervous => [
         { id => 1 },
         { id => 2 },
         { id => 3}
      ]
};

to_json($moods, { ut8 =>1, pretty => 1 });
Run Code Online (Sandbox Code Playgroud)

要么

my %moods;
$moods{'happy'} = "am happy";
$moods{'excited'} = "am excited";
push @{ $moods{nervous} }, { id => 2 };
push @{ $moods{nervous} }, { id => 3 };
push @{ $moods{nervous} }, { id => 4 };
Run Code Online (Sandbox Code Playgroud)

  • @ a7omiton那叫做*autovivification* - 如果变量里面没有任何内容,你在"左值上下文"中使用它作为数组引用,Perl会在那里放一个数组引用.如果您使用空变量作为哈希引用,Perl会在其中放置哈希引用.如果你将它用作一个字符串,你会得到一个空字符串等.这是一个非常有用的功能. (4认同)