使用 Perl 从 JSON 中提取 System.Title
Extracting System.Title from JSON with Perl
我正在尝试将 System.Title
值提取到 JSON 文件下方的变量中。我遇到了“不是数组引用”错误。你能帮忙吗?
my $json_text = do {
open(my $json_fh, "<:encoding(UTF-8)", $filename2)
or die("Can't open $filename2\": $!\n");
local $/;
<$json_fh>
};
my $json = JSON->new;
my $data = $json->decode($json_text);
for ( @{$data->{fields}} ) {
print "$_->{\"System.Title\"}.\"\n\"";
#@witems = "$_->{System.Title}";
push @wtitle,"$_->{\"System.Title\"}";
chomp @wtitle;
#print "@wtitle";
}
JSON 文件内容:
{
"id": 2110,
"fields": {
"System.CommentCount": 1,
"System.Title": "preprocessing with arrays",
"Microsoft.VSTS.Common.ResolvedBy": {
"displayName": "firstname, lastname",
"url": "https://dummyURL.com/4002-8be/_apis/Identities/6d91-9b75",
"_links": {
"avatar": {
"href": "https://azure.com/CARS/_apis/GraphProfile/MemberAvatars/aad.OS03ZDkxLTliN"
}
},
"id": "6d91-9b75",
"descriptor": "aad.OS03ZDkxLTliN"
},
"kanbanboard.Column": "To Do",
"kanbanboard.Column.Done": false
},
"_links": {
"fields": {
"href": "https://azure.com/CARS/ORG-ID/_apis/wit/fields"
}
},
"url": "https://azure.com/CARS/ORG-ID/_apis/wit/workItems/2110"
}
fields
是散列引用,不是数组引用。
my $json_text = do {
open(my $json_fh, "<:encoding(UTF-8)", $filename2)
or die("Can't open $filename2\": $!\n");
local $/;
<$json_fh>
};
my $json = JSON->new;
my $data = $json->decode($json_text);
print "$data->{fields}{'System.Title'}\n";
这会打印:
preprocessing with arrays
我用Data::Dumper来展示$data
的结构:
use Data::Dumper;
print Dumper($data);
如错误所述,您正在尝试将不是数组引用的内容用作数组引用。
您可以使用 Data::Dumper
检查变量:
use Data::Dumper;
print $data->{fields}, "\n";
这告诉你这是一个散列引用:
HASH(0x7fbd6d80ec90)
所以您可以只访问该散列并传递您想要的密钥名称,例如“System.Title”。
我也建议您始终 use warnings;
和 use strict;
。
整个代码如下所示(将示例 JSON 放在代码末尾的数据部分,这使得像这里这样的小示例更容易):
use strict;
use warnings;
use JSON;
$/ = undef;
my $json_text = <DATA>;
my $json = JSON->new;
my $data = $json->decode($json_text);
use Data::Dumper;
print $data->{fields}, "\n";
print ${$data->{fields}}{'System.Title'}, "\n";
__DATA__
{
"id": 2110,
"fields": {
"System.CommentCount": 1,
"System.Title": "preprocessing with arrays",
"Microsoft.VSTS.Common.ResolvedBy": {
"displayName": "firstname, lastname",
"url": "https://dummyURL.com/4002-8be/_apis/Identities/6d91-9b75",
"_links": {
"avatar": {
"href": "https://azure.com/CARS/_apis/GraphProfile/MemberAvatars/aad.OS03ZDkxLTliN"
}
},
"id": "6d91-9b75",
"descriptor": "aad.OS03ZDkxLTliN"
},
"kanbanboard.Column": "To Do",
"kanbanboard.Column.Done": false
},
"_links": {
"fields": {
"href": "https://azure.com/CARS/ORG-ID/_apis/wit/fields"
}
},
"url": "https://azure.com/CARS/ORG-ID/_apis/wit/workItems/2110"
}
我正在尝试将 System.Title
值提取到 JSON 文件下方的变量中。我遇到了“不是数组引用”错误。你能帮忙吗?
my $json_text = do {
open(my $json_fh, "<:encoding(UTF-8)", $filename2)
or die("Can't open $filename2\": $!\n");
local $/;
<$json_fh>
};
my $json = JSON->new;
my $data = $json->decode($json_text);
for ( @{$data->{fields}} ) {
print "$_->{\"System.Title\"}.\"\n\"";
#@witems = "$_->{System.Title}";
push @wtitle,"$_->{\"System.Title\"}";
chomp @wtitle;
#print "@wtitle";
}
JSON 文件内容:
{
"id": 2110,
"fields": {
"System.CommentCount": 1,
"System.Title": "preprocessing with arrays",
"Microsoft.VSTS.Common.ResolvedBy": {
"displayName": "firstname, lastname",
"url": "https://dummyURL.com/4002-8be/_apis/Identities/6d91-9b75",
"_links": {
"avatar": {
"href": "https://azure.com/CARS/_apis/GraphProfile/MemberAvatars/aad.OS03ZDkxLTliN"
}
},
"id": "6d91-9b75",
"descriptor": "aad.OS03ZDkxLTliN"
},
"kanbanboard.Column": "To Do",
"kanbanboard.Column.Done": false
},
"_links": {
"fields": {
"href": "https://azure.com/CARS/ORG-ID/_apis/wit/fields"
}
},
"url": "https://azure.com/CARS/ORG-ID/_apis/wit/workItems/2110"
}
fields
是散列引用,不是数组引用。
my $json_text = do {
open(my $json_fh, "<:encoding(UTF-8)", $filename2)
or die("Can't open $filename2\": $!\n");
local $/;
<$json_fh>
};
my $json = JSON->new;
my $data = $json->decode($json_text);
print "$data->{fields}{'System.Title'}\n";
这会打印:
preprocessing with arrays
我用Data::Dumper来展示$data
的结构:
use Data::Dumper;
print Dumper($data);
如错误所述,您正在尝试将不是数组引用的内容用作数组引用。
您可以使用 Data::Dumper
检查变量:
use Data::Dumper;
print $data->{fields}, "\n";
这告诉你这是一个散列引用:
HASH(0x7fbd6d80ec90)
所以您可以只访问该散列并传递您想要的密钥名称,例如“System.Title”。
我也建议您始终 use warnings;
和 use strict;
。
整个代码如下所示(将示例 JSON 放在代码末尾的数据部分,这使得像这里这样的小示例更容易):
use strict;
use warnings;
use JSON;
$/ = undef;
my $json_text = <DATA>;
my $json = JSON->new;
my $data = $json->decode($json_text);
use Data::Dumper;
print $data->{fields}, "\n";
print ${$data->{fields}}{'System.Title'}, "\n";
__DATA__
{
"id": 2110,
"fields": {
"System.CommentCount": 1,
"System.Title": "preprocessing with arrays",
"Microsoft.VSTS.Common.ResolvedBy": {
"displayName": "firstname, lastname",
"url": "https://dummyURL.com/4002-8be/_apis/Identities/6d91-9b75",
"_links": {
"avatar": {
"href": "https://azure.com/CARS/_apis/GraphProfile/MemberAvatars/aad.OS03ZDkxLTliN"
}
},
"id": "6d91-9b75",
"descriptor": "aad.OS03ZDkxLTliN"
},
"kanbanboard.Column": "To Do",
"kanbanboard.Column.Done": false
},
"_links": {
"fields": {
"href": "https://azure.com/CARS/ORG-ID/_apis/wit/fields"
}
},
"url": "https://azure.com/CARS/ORG-ID/_apis/wit/workItems/2110"
}