使用perl解析json文件

使用perl解析json文件,json,perl,Json,Perl,我正在尝试用perl解析json文件。我想提取键“name”及其对应的值。 我的文件看起来像这样 { "data":[ { "name":"ABC", "id":"123", }, { "name":"PQR", "id":"456", }, { "name":"XYZ", "id":"789", } ] } 我正在使用以下代码进行尝试: #/usr

我正在尝试用perl解析json文件。我想提取键“name”及其对应的值。 我的文件看起来像这样

{
 "data":[
    {
        "name":"ABC",
        "id":"123",
    },
    {
        "name":"PQR",
        "id":"456",
    },
    {
        "name":"XYZ",
        "id":"789",
    }
]
}
我正在使用以下代码进行尝试:

#/usr/lib/perl
use lib qw( ..);
use LWP::Simple;
use JSON;
my $filename = '/file.txt';
my $data;
if (open (my $json_str, $filename))
{
  local $/ = undef;
  my $json = JSON->new;
  $data = $json->decode(<$json_str>);
  close($json_stream);
}
print $data->{name};
#/usr/lib/perl
使用libqw(…);
使用LWP::Simple;
使用JSON;
我的$filename='/file.txt';
我的$数据;
if(打开(my$json_str$filename))
{
本地$/=undef;
my$json=json->new;
$data=$json->decode();
关闭($json_流);
}
打印$data->{name};
但我没有得到任何输出


有人能告诉我出了什么问题吗?

您的json文件无效

第5、10、15行不应以逗号结尾,因为这是这些散列的最后一对键/值

修复该问题后,下面是代码的一个版本,它将为您提供预期的结果:

#/usr/lib/perl
use strict;
use warnings;

use lib qw(..);

use JSON qw( );

my $filename = 'file.txt';

my $json_text = do {
   open(my $json_fh, "<:encoding(UTF-8)", $filename)
      or die("Can't open \$filename\": $!\n");
   local $/;
   <$json_fh>
};

my $json = JSON->new;
my $data = $json->decode($json_text);

for ( @{$data->{data}} ) {
   print $_->{name}."\n";
}
#/usr/lib/perl
严格使用;
使用警告;
使用libqw(…);
使用jsonqw();
我的$filename='file.txt';
我的$json_text=do{

open(my$json_fh,“除了在json字符串中有一个额外的逗号外,您没有引用正确的值。始终使用

use strict; 
use warnings;
--它们会告诉您出了什么问题。在这种情况下,您正在打印一个未定义的值
$data->{name}
,一个尚未赋值的变量。如果您在
data::Dumper
中打印解码后的结构,则如下所示:

$VAR1 = {
          'data' => [
                      {
                        'name' => 'ABC',
                        'id' => '123'
                      },
                      {
                        'name' => 'PQR',
                        'id' => '456'
                      },
                      {
                        'name' => 'XYZ',
                        'id' => '789'
                      }
                    ]
        };
如您所见,
$data
实际上是一个散列引用,其中第一个也是唯一的键称为
'data'
,其值是一个包含三个元素的数组,每个元素都包含一个散列引用。因此,要打印这些元素,您需要执行以下操作:

print $data->{data}[0]{name};   # prints ABC

my $aref = $data->{data};
for my $element (@$aref) {
    print $element->{name};     # prints ABC, PQR, XYZ
}

使用此页面验证或jsonDoesn您的
是否打开(…)
泄漏打开的文件?它是什么时候打开的。非常好的实现和解释。下面是另一个
映射{print${name};}{$data->{data};
或者您可以
打印连接(“,”,(map{${name}}}{data->{data}))
但它仍然是一个循环。为什么需要非循环解决方案?