Perl - 接收JSON并在模板上呈现

时间:2018-02-01 12:32:45

标签: json perl mojolicious

我试图扩展一些应用,但我之前从未使用过Perl。这使用de框架Mojolicious。 现在我能够写这个,但我无法找到如何检查它是否正确。

    use JSON::XS;
    use JSON qw( decode_json );
    my $self = shift; 
    my $req = HTTP::Request->new("GET", "https://jsonplaceholder.typicode.com/comments");

    my $ua = LWP::UserAgent->new(
            keep_alive => 1,
            timeout => 3000,
            ssl_opts => {
                verify_hostname => 0,
                SSL_verify_mode => IO::Socket::SSL::SSL_VERIFY_NONE
            },
        );
    my $response = $ua->request($req);
    my $body = $response->decoded_content();

$self->stash(
        'body' => $body
        );

    $self->render('view_');
    return;

在模板上我尝试这样的事情:(找到某处的例子)

<% foreach my $element (@{$body->{"element"}}) { %>
    <p><%= $element->[1]->{"id"} %></p>
<% } %>

但得到了错误:

Can't use string ("[ { "postId": 1, "id":"...) as a HASH ref while "strict refs" in use at template view_.html.ep line 228.

1 个答案:

答案 0 :(得分:1)

您的错误看起来很清楚:

  

不能使用字符串(&#34; [{&#34; postId&#34;:1,&#34; id&#34;:&#34; ...)作为HASH参考号&#34;严格参考&#34;在模板view_.html.ep第228行使用。

它在你的模板中引用了这一行:

<% foreach my $element (@{$body->{"element"}}) { %>

在此代码中,您使用变量$body并期望它包含哈希引用(因为您在其上使用->{...}运算符)。但是,正如错误所说,它不包含哈希引用,它包含一个字符串。

所以问题是你有一个JSON字符串,你期望一个Perl引用。这意味着你没有对你的JSON字符串进行JSON解码。

也许您认为$response->decoded_content();执行JSON解码。但它并没有。这样可以实现更高级别的解码。正如documentation for HTTP::Response says

  

$ r-&gt; decoding_content(%options)

     

这将在解码任何Content-Encoding和字符集后返回内容。有关详细信息,请参阅HTTP :: Message。

关于JSON解码没有任何内容。

这就是你加载(两个!)JSON模块的原因。您需要使用其中一个将JSON解码为Perl数据结构。这样的事情,也许是:

my $body = decode_json( $response->decoded_content() );

[注意:在评论中,melpomene正确地指出了这个问题。正确的代码是:

my $body = decode_json( $response->content() );

即。在将响应正文发送到decode_json()之前,您不应该对其进行解码。]

至少,这会让你引用$body。我看到了另一个问题。您的JSON字符串以[开头,因此它将解码为数组引用,而不是哈希引用。您需要处理这一变化。不幸的是,我对您的数据或您尝试做的事情了解不足以建议解决该问题。