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

时间:2015-05-20 13:21:01

标签: json perl template-toolkit

我想通过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的id

2)显示该块的数据

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

有任何帮助吗? :)

2 个答案:

答案 0 :(得分:1)

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

但是,您可以像这样解码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无效,所以我不得不稍微修改它。希望这是你的来源的换位错误。

答案 1 :(得分:1)

如果你需要检查多个用户,你真的想要一个哈希而不是一个数组。

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 -%]