0

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 です。

手がかりはありますか?

4

3 に答える 3

2

配列の配列ではなく、キーと値のペアを持つオブジェクトの配列を出力する場合to_jsonは、最初に適切なデータを配置します。

つまり、配列参照の配列ではなく、ハッシュ参照の配列です。

を使用mapしてデータを変換できます。

于 2012-04-09T14:17:31.200 に答える
2

基本的に、配列の配列をハッシュの配列に変換したい場合は、 を使用してこれを行うことができますmap。あなたの構造であると仮定すると$data、これでうまくいくはずです:

for my $key (keys %$data) {
    $data->{$key} = [
        map {
            { id => $_->[0], DateStart => $_->[1], DateEnd => $_->[2] }
        } @{$data->{$key}}
    ];      
}
于 2012-04-09T20:57:15.480 に答える
2

このようなことを試みるときはいつでも、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;

これ以上簡単なことはありません。最良の部分は、配列構造がどれほど複雑になっても、これが機能することです。

于 2012-04-09T15:38:05.930 に答える