模板工具包 - 按 ID 显示数组

Template Toolkit - Display array by ID

我想通过 ID 显示数组块 - 我可以使用 Template Toolkit 执行此操作还是在 Perl 控制器端执行此操作? (我正在使用 Dancer & REST::Client 来获取 JSON)

这是JSON:

    {
        "user":
        [
            { 
            "id": 12345,
                "name": bob,
                "age": 22,
                "birth_place": "London"
            },
            { 
            "id": 12346,
                "name": amy,
                "age": 20,
                "birth_place": "London"
            }
        ]
    }

我正在控制器中获取用户 ID,因此我可以使用 [% user.id %] 在模板中显示该 ID。所以我希望能够基本上做到

1) 如果用户 ID 与 JSON

中的其中一个 ID 匹配

2) 显示来自该块的数据

Name: [% content.name %]
Age: [% content.age %]
Birth Place: [% content.birth_place %]

有什么帮助吗? :)

我不会给你一个完整的解决方案,因为它又长又复杂,而且你没有提供足够的细节来让它成为可能。

但是,您可以像这样解码 JSON:

use strict;
use warnings;

use JSON; 

my $JSON_text = '{
        "user":
        [
            { 
            "id": 12345,
                "name": "bob",
                "age": "22",
                "birth_place": "London"
            },
            { 
            "id": 12346,
                "name": "amy",
                "age": "20",
                "birth_place": "London"
            }
        ]
    }';

my $JSON = decode_json ( $JSON_text ); 
foreach my $element ( @{$JSON->{"user"}} ) {
   print $element->{"id"}, "\n";
}

我将留给您尝试弄清楚如何将您想要的字段提取到模板中。顺便说一句 - 您发布的 JSON 无效,所以我不得不稍微修改一下。希望这是您源代码中的换位错误。

如果您需要检查多个用户,您确实需要散列而不是数组。

my $data = decode_json(...);
my %data_by_userid = map { $_->{id} => $_ } @{ $data->{user} };

模板参数:

data_by_userid => \%data_by_userid

然后,您将使用

[% user = data_by_userid.$id -%]
[% IF user -%]
Name: [% user.name %]
Age: [% user.age %]
Birth Place: [% user.birth_place %]
[% END -%]

如果模板中只需要一个用户,只需使用

my $data = decode_json(...);
my ($user) = grep { $_->{id} == $id } @{ $data->{user} };

模板参数:

user => $user

然后,您将使用

[% IF user -%]
Name: [% user.name %]
Age: [% user.age %]
Birth Place: [% user.birth_place %]
[% END -%]