使用 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"
}