在文件中对JSON行进行排序

时间:2015-11-26 17:39:36

标签: json perl sorting

我正在解析几个日志行并将每个日志行转换为JSON。之后,我将此JSON附加到文件

my %logContent = (
  sequence_number => 0001,
  line => "2015-11-27T14:32+05:00 abc.com ssh[2321] fjdklsfjlsdlfksd",
  line_number => 689,
);
open (FILE, ">>", "somefile") or die "Cannot open file for append!";
print FILE encode_json \%logContent;

所以现在我有一个包含几行JSON的文件,如:

{sequence_number: 0001, line: gibberish, ...}
{sequence_number: 0003, line: gibberish, ...}
{sequence_number: 0002, line: gibberish, ...}

我想知道根据“sequence_number”的值对JSON行进行排序的最简单方法。换句话说,我希望最终输出类似于:

{sequence_number: 0001, line: gibberish, ...}
{sequence_number: 0002, line: gibberish, ...}
{sequence_number: 0003, line: gibberish, ...}

我还有另一个问题:你们/ gals是否认为在正确的行中将新的JSON行插入(不附加)到文件中会更容易,使得最终文件默认排序?我该怎么做?

提前致谢。

1 个答案:

答案 0 :(得分:5)

您的文件不是JSON文档。您的文件包含一系列JSON文档。要解析它,我们可以使用JSON::XS中的增量解析器,如下所示:

use JSON::XS qw( );

my $file; { local $/; $file = <>; }

my $json = JSON::XS->utf8->new();
my @objs = $json->incr_parse($file);

@objs = sort { $a->{sequence_number} <=> $b->{sequence_number} } @objs;

for my $obj (@objs) {
   print($json->encode($obj), "\n");
}

如果您假设文件的每一行都是一个单独且完整的JSON文档(根据您创建它们的方式而无法保证),您可以使用以下内容。但它并没有真正为你节省任何东西:

use JSON::XS qw( );

my $json = JSON::XS->utf8->new();

my @objs;
while (<>) {
   push @objs, $json->decode($_);
}

@objs = sort { $a->{sequence_number} <=> $b->{sequence_number} } @objs;

for my $obj (@objs) {
   print($json->encode($obj), "\n");
}