【问题标题】:Perl to JSON, with key/value pairsPerl 到 JSON,带有键/值对
【发布时间】:2012-04-10 23:40:00
【问题描述】:

我正在尝试将一些数据从 Perl 输出到 JSON。我可以做一个简单的输出,但想更好地构建它。

我有一个带有 id、开始时间和结束时间的数组。这是我用来输出的代码:

print header('application/json');
my $json->{$entry} = \@array;
my $json_text = to_json($json);
print $json_text;

返回:

{"Season":[["1","1330065300","1344038401"],["7","1298505601","1312416001"]]}

但我想输出更像:

{"Season":0[{"id":1,"DateStart":1330065300,"DateEnd":1344038401},{"id":7,"DateStart":1298505601,"DateEnd":1312416001}]}

谁能帮助我更好地构建我的输出结构?

---更新------

谢谢迈克尔。我已尝试实现您的示例。

这是目前的代码:

foreach my $key (keys %$seasons)
    {
        $seasons->{$key} =
        [
            map
            {
                { id=>$_[0], DateStart=>$_[1], DateEnd=>$_[2] }
            } @{$seasons->{$key}}
        ];
    }

但它返回错误(参考 foreach 行):

Not a HASH reference at line 148

$seasons 是从 SQL fetchall_arrayref 返回的 arrayref

有什么线索吗?

【问题讨论】:

  • 你能使用像search.cpan.org/~mlehmann/JSON-XS-2.32/XS.pm这样的CPAN库吗?
  • 您说要返回的代码是无效的JSON。 0 真的应该在那里吗?
  • 如果你想要 JSON 中的散列,那部分结构必须是 Perl 结构中的散列。
  • 错误信息很好地解释了它——当你传递一个数组引用时,需要一个哈希引用。尝试将foreach 行替换为foreach my $key (keys @$seasons),并将出现的$seasons->{$key} 替换为$seasons->[$key]

标签: json perl


【解决方案1】:

您基本上希望将数组数组转换为哈希数组,您可以使用map 来完成此操作。假设 $data 是您的结构,应该这样做:

for my $key (keys %$data) {
    $data->{$key} = [
        map {
            { id => $_->[0], DateStart => $_->[1], DateEnd => $_->[2] }
        } @{$data->{$key}}
    ];      
}

【讨论】:

  • 嗨迈克尔,你能检查我更新的代码,让我知道我做错了什么吗?
【解决方案2】:

如果您想输出带有键/值对的对象数组而不是数组数组,那么首先将适当的数据放入to_json

即hashrefs 数组,而不是 arrayrefs 数组。

你可以use map to transform the data

【讨论】:

    【解决方案3】:

    每当您尝试这样的事情时,请始终检查 CPAN 以查看是否有人以前做过,而不是尝试重新发明轮子。我发现了一个名为 JSON 的模块,它似乎完全符合您的要求。

    该页面上有一个完全符合您要求的示例。这是一个简短的解释:

    use JSON; # imports encode_json, decode_json, to_json and from_json.
    
    # simple and fast interfaces (expect/generate UTF-8)
    my $utf8_encoded_json_text = encode_json \@array;
    

    没有比这更容易的了。最好的部分是,无论您的数组结构变得多么复杂,这都可以正常工作。

    【讨论】:

    • 显然,提问者已经在使用 JSON 模块了。代码中有对to_json的调用。
    猜你喜欢
    • 2016-01-18
    • 1970-01-01
    • 1970-01-01
    • 2020-06-17
    • 1970-01-01
    • 1970-01-01
    • 2017-07-30
    • 2015-07-06
    • 1970-01-01
    相关资源
    最近更新 更多