Perl,遍历json字符串,在一个变量中获取键/值对象

时间:2018-01-17 15:04:33

标签: perl

一直在寻找一种从json字符串获取key \值的方法,而不必根据该对构建新的json字符串。

有以下示例代码:(我已经修改了Here的代码)

#!/usr/bin/perl
use strict;
use warnings;

use Data::Dumper qw(Dumper);

my $grades = {'PetiBar' => {
                          'Mathematics' => 82,
                          'Art' => 99,
                          'Literature' => 88
                        },
          'FooBar' => {
                         'Mathematics' => 97,
                         'Literature' => 67
                       }
        };

我照顾的结果是:

'PetiBar' => {
             'Mathematics' => 82,
             'Art' => 99,
             'Literature' => 88
             }

这将给两个对象,而不仅仅是一个:

foreach my $val ($grades) {
    print Dumper $val;
}

这只会给我没有键的值:

foreach my $key (keys %{$grades}) {
    print Dumper $grades->{$key};
}

如何同时获取变量?我是否必须获取键和值,并从中构建一个新的json字符串?

我有一些正在运行的代码here

4 个答案:

答案 0 :(得分:2)

以下内容完全符合您的要求,但如果您需要更灵活的内容,请参阅其他答案:

my $petibar = { PetiBar => $grades->{PetiBar} };

答案 1 :(得分:1)

有很多方法可以做你想要的,这是一种方式:

my %slice = map { $_ => $grades->{$_} } qw/Petibar/

最后的qw//列表意味着您可以根据需要轻松添加更多密钥以从同一结构中提取。

答案 2 :(得分:1)

如果您的Perl至少是版本5.20,则可以使用a hash slice

my %foo = qw/a 1 c 2 e 3/;
my %bar = %foo{qw/a c/};

是的,没错,%前面有一个{}印章。花括号里面可以有一个列表。

这是%bar将包含的内容。

(
    a =>  1,
    c =>  2
)

通常情况下,这将通过哈希来完成,但由于您有哈希引用,因此需要取消引用,然后创建键/值对进入的新匿名引用。

my $slice = { %{$grades}{PetiBar} };

答案 3 :(得分:1)

您可以将Data::Dumper' configuration variable $Data::Dumper::Varname设置为密钥的值:

foreach my $key ( keys %$grades ) {
    $Data::Dumper::Varname = $key;
    ## remove '#' to enable the if clause
    print Dumper $grades->{$key} # if $key eq "PetiBar";
}

这将产生以下输出:

$FooBar1 = {
             'Mathematics' => 97,
             'Literature' => 67
           };
$PetiBar1 = {
              'Mathematics' => 82,
              'Literature' => 88,
              'Art' => 99
            };