在Perl Dancer应用程序中解析来自Net::Twitter::Lite::WithAPIv1_1的json响应

在Perl Dancer应用程序中解析来自Net::Twitter::Lite::WithAPIv1_1的json响应,json,perl,twitter,dancer,Json,Perl,Twitter,Dancer,前言:我是Perl的“新手”,这意味着3天前我还没有用Perl写过任何东西,因为恐龙在地球上漫游。是的,我是RTFM,但在这方面还是新手 因此,我试图解析对twitterapi调用的响应。使用TT模板解析响应在视图端非常有效,只需调用一次TwitterAPI(通过awesome Net::Twitter::Lite)。但是现在我需要进行两个调用,从数据中提取两个Perl字符串数组,压缩它们,然后在寻找它们的交集时对它们进行uniq 我对这次电话的回应是: my @response = $nt-&

前言:我是Perl的“新手”,这意味着3天前我还没有用Perl写过任何东西,因为恐龙在地球上漫游。是的,我是RTFM,但在这方面还是新手

因此,我试图解析对twitterapi调用的响应。使用TT模板解析响应在视图端非常有效,只需调用一次TwitterAPI(通过awesome Net::Twitter::Lite)。但是现在我需要进行两个调用,从数据中提取两个Perl字符串数组,压缩它们,然后在寻找它们的交集时对它们进行uniq

我对这次电话的回应是:

my @response = $nt->friends_list({ screen_name => 'someguyiknow' }); #not an actual screen name!
正如预期的那样,我刚打印出来时是这样的: 散列(0x7fb5093bf458)

如果我打印Dumper(\n@response),我还得到了我所期望的,一个包含格式精美的JSON的哈希对象数组,所有这些对象都打印得很漂亮。(如果我使用$response,则结果相同。)

所以我试着钻研这个散列:

foreach my $key ( keys %data )
{
  print "key: $key, value: $data{$key}\n";
}
这将为key:HASH(0x7fb3aa516968)提供值:

值,当然,空白的b/c哈希不是键

所以我钻得更深:

foreach my $key ( keys %data )
{
  my %key = $key;
  foreach my $k ( keys %key )
  {
     print "key: $k, value: $key{$k}\n"
  }    
}
再次得到key:HASH(0x7fa7a20081f8),value:

所以我决定采用不同的方法,使用JSON解析方法

然而,关于这个主题的任何变化(相信我,我已经尝试了很多变化——内部循环,各种SO消息中的奇怪东西,等等):

所有这些都会产生这种奇妙的神秘错误: 格式错误的JSON字符串,在字符偏移量0处没有标记、数组、对象、数字、字符串或原子

是的,我搜索了神秘的错误消息!!唉,没有一个答案能帮上忙

所以!我决定可能需要去_json:

my $json = to_json $response;
print "$json\n";
呼!json出来了,都打印得很漂亮。除了我还有一个

“第41行打印的宽字符”,即:打印“$json\n”

JSON如下所示:

{ “上一个光标”\u str:“0”, “下一个光标”str:“1446632917268460946”, “上一个光标”:0, “下一个光标”:1446632917268460946, “用户”:[

我需要的是“用户”字段中的数据

所以我只需要一个Perl标量,对吗

my $perl_scalar = from_json($json);
print "$perl_scalar\n";
这就产生了这个神秘的错误: “子例程条目中的宽字符”

当被搜索时,错误信息也只产生了很少的结果。据一个人说,显然“bug没有功能”。唉

因此,我尝试从json哈希中获取值:

print "$json->{users}{screen_name}\n";
这让我“不能使用字符串(”{ “上一个\u游标\u str”:“0”“…)作为哈希引用,而“严格引用”

毫不奇怪,它不会显示任何搜索结果。如果可行,我还尝试打印$json.user.screen_name。不,当然不会那么容易

据我所知,基本上我现在有了一个合适的json对象。我只需要解析它并将screen_name字段收集到一个Perl标量中作为字符串。这似乎并不不合理,但我发现这是完全不可能的

完全被难住了!任何帮助(最好是不刺耳的)都会让人大吃一惊


谢谢!

根据的文档,friend方法返回一个hashref:

  • 朋友
  • 别名:好友列表
    • 参数:用户id、屏幕名称、光标
    • 必填项:无
    • 返回用户的用户对象的游标集合,后跟指定的用户
    • 返回:HashRef
这里没有任何关于JSON的内容,因此如果您想查看返回值的结构,可以使用或


如果您在导航返回的结构时遇到问题,您可以将转储输出的副本粘贴到此处以获取建议。但是您不需要使用JSON。

perl中的引用有点像C中的指针,因为它们是标量,您必须取消引用它们才能将其用作引用类型,语法也有点古怪我很可能想阅读perldoc perlref的完整故事

首先,根据,friends_list返回一个hashref,因此您希望将其分配给标量,而不是列表,因此:

my $response = $nt->friends_list(blah);
接下来,要使用hashref,您需要正确地取消对它的引用。下面是一个简单的示例:

use warnings;
use strict;

my $hr = {# curly brackets make a hashref, see perldoc perldata
          one => 1,
          two => 2,
          three => 3,
          };

print $hr, "\n";
print %$hr, "\n";
print $$hr{one}, "\n";

foreach my $k (keys %$hr) {
  print "$k\n";
}
应输出:

HASH(0x1fce1c)
three3one1two2
1
three
one
two
您可以看到hashref被取消引用为具有
%$hr
的散列,或者使用
$$hr{one}
查找键


克里斯

谢谢米勒!这很有帮助。
use warnings;
use strict;

my $hr = {# curly brackets make a hashref, see perldoc perldata
          one => 1,
          two => 2,
          three => 3,
          };

print $hr, "\n";
print %$hr, "\n";
print $$hr{one}, "\n";

foreach my $k (keys %$hr) {
  print "$k\n";
}
HASH(0x1fce1c)
three3one1two2
1
three
one
two