1

我试图以我得到的 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 中。

4

3 回答 3

2

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

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

例如

sub printer {
    my @data;
    foreach ...{
        push(@data, id_cards());
    }
    print JSON::to_json(\@data);
}
于 2013-10-18T19:23:17.617 回答
1

您已经在id_cardssub 中有正确的想法:

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什么的。

于 2013-10-18T22:20:34.723 回答
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"}]]
于 2013-10-18T20:04:13.463 回答