【问题标题】:Perl - Receive JSON and render on templatePerl - 接收 JSON 并在模板上呈现
【发布时间】:2018-02-01 12:32:44
【问题描述】:

我正在尝试扩展一些应用程序,但我以前从未使用过 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.

【问题讨论】:

  • 我不确定这里是否有足够的信息可以提供帮助。对于初学者 - $tempHash 可能不是哈希。它是对数组的引用。
  • 嗨@Sobrique 您还需要什么信息?谢谢
  • $comments 来自哪里?两个代码块之间存在差距,这意味着您绝对没有minimal reproducible example 供人们查看
  • 你以前写过程序吗?

标签: json perl mojolicious


【解决方案1】:

你的错误看起来很清楚:

在模板 view_.html.ep 第 228 行使用“严格引用”时,不能使用字符串 ("[ { "postId": 1, "id":"...) 作为 HASH 引用。

它指的是模板中的这一行:

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

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

所以问题是你有一个 JSON 字符串,你需要一个 Perl 引用。这意味着您尚未对 JSON 字符串进行 JSON 解码。

也许您认为$response-&gt;decoded_content(); 会进行 JSON 解码。但事实并非如此。这样可以进行更高级别的解码。作为documentation for HTTP::Response says

$r->decoded_content(%options)

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

没有关于 JSON 解码的内容。

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

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

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

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

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

这至少可以让您获得$body 的引用。我看到另一个问题。您的 JSON 字符串以 [ 开头,因此它将解码为数组引用,而不是哈希引用。你需要应对这种变化。不幸的是,我对您的数据或您尝试做的事情的了解不够,无法提出解决该问题的方法。

【讨论】:

  • 非常感谢您的回答。这个 api 只是一个例子。实际上我的 API 以:{ "data": [{..}, {...}] } 开头,所以我希望我不会有问题
  • 请注意decode_json($r-&gt;decoded_content) 并不完全正确,因为decoded_content 返回一个unicode 文本字符串,但decode_json 接受一个字节字符串(UTF-8 格式)。
  • 感谢@DaveCross 和 melpomene。关于我的foreach,请告诉我我是否进展顺利?感谢您有时间向我解释这一点。 Perl 真的很复杂,当你什么都不知道的时候,你必须快速完成一些任务。
猜你喜欢
  • 2019-09-15
  • 1970-01-01
  • 2016-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多