从perl打印json是不正确的

时间:2013-10-18 19:12:53

标签: json perl

我试图以json格式打印出我已经获得的信息,我想如果我展示了我所拥有的那些将更好地解释一切。

foreach ...{
    printer($versions);
}

sub printer
    {
    foreach ...{
         my $results = id_cards();

    my $toJsonResult = JSON::to_json($results);
    print $toJsonResult;
    }
}

sub id_cards
{
    my $returnData = [];
    for($x=1;$y < $vehicle->{'ROWS'};$x++ )
    { 
          my $data;
          $data->{year} = $vehicle->{$x}->{'YEAR'};  #there is more $data->repetativeness but not important to get the point
          push(@$returnData,$data);

          $y++
    }

return $returnData;
}

打印的json:

[{"year":"2004"},{"year":"2004"}][{"year":"2002"},{"year":"2000"},{"year":"1994"}][{"year":"2004"},{"year":"1955"}][{"year":"2004"},{"year":"1955"}]

这非常接近我想要的但是没有json“对象”的分离? (不确定这个术语是什么)但它使它无效json。我可以做些什么来将年份相应地分组,但是在有效的json中。

3 个答案:

答案 0 :(得分:2)

您正在循环中打印多个 JSON文本。每次循环时,都会打印一个新的JSON文本。

您应该在循环中构建数据结构,然后将整个事物转换为JSON。

e.g。

sub printer {
    my @data;
    foreach ...{
        push(@data, id_cards());
    }
    print JSON::to_json(\@data);
}

答案 1 :(得分:1)

您已在id_cards sub:

中找到了正确的想法
sub some_function {
    my $return_array = [];
    foreach (...) {
        push(@$return_array, $some_result);
    }
    return $return_array;
}

printer中执行相同的操作:

sub printer {
    my $return_array = [];
    # for ...
    return $return_array;
}

然后在文件顶部最外面的foreach执行相同的操作:

my $results = [];
foreach (...) {
    push(@$results,printer($versions));
}
print JSON.to_json($results);

仅在最后一刻打印一次。 JSON期望完全形成的数据结构。如果你没有给它一切,那么你不能指望它知道如何正确地格式化它。

当然,此时,函数printer不会打印任何内容。所以它被误解了。我会将其名称更改为card_collection或其他内容。

答案 2 :(得分:0)

您正在有效地执行以下操作:

my $result = [ { year => 2002 }, { year => 2003 } ];
my $toJsonResult = JSON::to_json($results);
print $toJsonResult;  # [{"year":"2002"},{"year":2003"}]

my $result = [ { year => 2004 }, { year => 2005 } ];
my $toJsonResult = JSON::to_json($results);
print $toJsonResult;  # [{"year":"2004"},{"year":2005"}]

my $result = [ { year => 2006 }, { year => 2007 } ];
my $toJsonResult = JSON::to_json($results);
print $toJsonResult;  # [{"year":"2006"},{"year":2007"}]

为每个结果创建一个新的JSON文档,并在STDOUT上将它们全部绑定在一起。

您希望创建一个包含所有结果数组的文档,因此您需要将所有结果放在数组中。

my @results

my $result = [ { year => 2002 }, { year => 2003 } ];
push $results, $result;

my $result = [ { year => 2004 }, { year => 2005 } ];
push $results, $result;

my $result = [ { year => 2006 }, { year => 2007 } ];
push $results, $result;

my $toJsonResult = JSON::to_json(\@results);
print $toJsonResult;  # [[{"year":"2002"},{"year":"2003"}],
                      #  [{"year":"2004"},{"year":"2005"}],
                      #  [{"year":"2006"},{"year":"2007"}]]