2015-05-20 3 views
-3

Я хочу отобразить блок массива по ID - могу ли я сделать это с помощью Template Toolkit или будет он на стороне контроллера Perl? (Я использую Танцовщица & REST :: Client, чтобы захватить JSON)Template Toolkit - Показать массив по ID

Это JSON:

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

Я получаю идентификатор пользователя в контроллере, так что я могу отобразить идентификатор в шаблоне с [% user.id %]. Поэтому я хочу, чтобы иметь возможность в основном делать

1) Если идентификатор пользователя соответствует идентификатор одного из идентификаторов в формате JSON

2) данные дисплея из этого блока

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

Любая помощь? :)

ответ

0

Если вам нужно проверить наличие нескольких пользователей, вам действительно нужен хеш, а не массив.

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 -%] 
+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, который вы опубликовали, недействителен, поэтому мне пришлось немного изменить его. Надеюсь, это ошибка транспонирования на вашем источнике.

+0

Спасибо за помощь! –

Смежные вопросы