perl反序列化长度计数中的json不起作用

时间:2012-02-21 00:56:27

标签: php json perl

如何遍历反序列化的json字符串?我现在无法获得正确数量的值,它不算数。

my $list = request("http://localhost/getjson.php");                             
my $deserialize = from_json( $list );
print Dumper($deserialize);
$VAR1 = [
          'ab',
          'cc',
          'de',
          'aer',
          'ffe',
          'cer',
          'dad',
          'efef',
          'afaf',
          'ege',
          'grsc',
          'cegg',
          'cegg',          
          'cegg/aaa.html',
          'eggt',
          'ttt'
        ];
print length($deserialize);
13 ?? it should say 16

3 个答案:

答案 0 :(得分:5)

您将返回数组引用而不是数组。您需要取消引用该值。

my @array = @$deserialize; # or @{ $deserialize }
print scalar @array;

此外,如果您想迭代数组,可以使用for

for (@$deserialize) { 
    # do stuff 

答案 1 :(得分:1)

来自perldoc -f length

This function cannot be used on an entire array or hash to find
out how many elements these have.  For that, use "scalar
@array" and "scalar keys %hash", respectively.

您不能使用length来查找数组的大小。为此,请使用上面的建议。

你的错误会给你一个错误值,因为你正在获取数组引用的长度,在字符串上下文中它将类似ARRAY(0x22d0a88),在你的情况下似乎是13个字符长。例如。相当于:

print length "ARRAY(0x22d0a88)";

作为一个奇怪的旁注,如果你做length(@array),它实际上将返回数组长度的长度。例如。大小为16的数组将返回2,因为字符串"16"长度为两个字符。

答案 2 :(得分:1)

您实际上是在参考结果。由于JSON可以包含各种不同的结果,因此decode_json不会特别返回列表。

因此,您需要取消引用您拥有的变量:$ deserialize

此外,您真的不想使用长度函数。如果打印数组的整数值(或标量值),它将返回它的大小。

所以这就是你想要的:

my $list = request("http://localhost/getjson.php");                             
my $deserialize = from_json( $list );
print scalar (@{$deserialize});

这将打印数组的大小。

如果您想从一个数组开始,您可以这样做:

my $list = request("http://localhost/getjson.php");                             
my $deserialize = from_json( $list );
my @json_array = @{$deserialize});
print scalar (@json_array);