我试图扩展一些应用,但我之前从未使用过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.
答案 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字符串以[
开头,因此它将解码为数组引用,而不是哈希引用。您需要处理这一变化。不幸的是,我对您的数据或您尝试做的事情了解不足以建议解决该问题。