我试图在perl中解析一个json文件.我想提取关键字"名称"及其对应的值.我的文件看起来像这样
{
"data":[
{
"name":"ABC",
"id":"123",
},
{
"name":"PQR",
"id":"456",
},
{
"name":"XYZ",
"id":"789",
}
]
}
Run Code Online (Sandbox Code Playgroud)
我正在尝试下面的代码:
#/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};
Run Code Online (Sandbox Code Playgroud)
但我没有得到任何输出.
谁能告诉我什么是错的?
ave*_*age 21
您的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";
}
Run Code Online (Sandbox Code Playgroud)
一些问题:
$json_stream和$json_str.您打算$json_stream在所有地方使用来表示文件句柄$data->{name}应在上传.json文件被施加到所述阵列的所有成员,而不是到JSON本身.所以你需要先迭代它们调试时,请确保您的json有效.通过jsonlint.com或来自cpan的JSON :: XS附带的json_xs实用程序.
JSON可以描述复杂的数据结构,因此当您将其解析为Perl时,您也会获得复杂的数据结构.尝试首先使用Data :: Dumper或Data :: Printer或Data :: TreeDumper查看数据结构
除了在 JSON 字符串中有一个额外的逗号之外,您没有引用正确的值。一直使用
use strict;
use warnings;
Run Code Online (Sandbox Code Playgroud)
——他们会告诉你出了什么问题。在这种情况下,您正在打印一个 undefined value $data->{name},一个尚未赋值的变量。如果你打印你的解码结构,Data::Dumper它看起来像这样:
$VAR1 = {
'data' => [
{
'name' => 'ABC',
'id' => '123'
},
{
'name' => 'PQR',
'id' => '456'
},
{
'name' => 'XYZ',
'id' => '789'
}
]
};
Run Code Online (Sandbox Code Playgroud)
正如你所看到的,$data实际上是一个散列引用,其中第一个也是唯一一个键被称为'data',其值是一个包含三个元素的数组,每个元素包含一个散列引用。因此,为了打印这些元素,您可以执行以下操作:
print $data->{data}[0]{name}; # prints ABC
my $aref = $data->{data};
for my $element (@$aref) {
print $element->{name}; # prints ABC, PQR, XYZ
}
Run Code Online (Sandbox Code Playgroud)