如何忽略 Perl 中格式错误的 JSON 字符串




我的文件夹中有 +1000 个 json 文件,当我尝试从这个 +1000 个文件中解析数据时,我在 +100 解析后收到此错误:

malformed JSON string, neither array, object, number, string or atom, at character offset 0 (before "(end of string)") at -e line 1.

请如何忽略此错误让命令解析所有文件。
我的命令:

perl -MJSON::XS -CS -0777ne'
BEGIN { $j = JSON::XS->new->relaxed(1) }
s/^(//;  s/)z//;
CORE::say
join ",",
map { join ":", $_->{company}, $_->{time} }
@{ $j->decode($_)->{Companies} }
' *.json

谢谢

尝试使用evaldecode()中捕获异常:

perl -MJSON::XS -CS -0777ne'
BEGIN { $j = JSON::XS->new->relaxed(1) }
s/^(//;  s/)z//;
eval { $j->decode($_) };
next if $@;
CORE::say
join ",",
map { join ":", $_->{company}, $_->{time} }
@{ $j->decode($_)->{Companies} }
' *.json

注意:如果文件很大,您可以通过将解码的变量存储在 eval 块中来节省时间(通过不解码文件两次):eval { $data = $j->decode($_) }及以后使用$data->{Companies}

位置 0 处的字符串末尾表示您传递了一个空字符串(或 undef?只需检查文件($_)是否为空并跳过该文件。

perl -MJSON::XS -CS -0777ne'
BEGIN { $j = JSON::XS->new->relaxed(1) }
s/^(//;  s/)z//;
if (!length($_)) {
warn("Skipping $ARGV: Empty.n");
next;
}
CORE::say
join ",",
map { join ":", $_->{company}, $_->{time} }
@{ $j->decode($_)->{Companies} };
' *.json

您可以更进一步,跳过产生任何类型错误的所有文件(允许您修复它们或手动处理它们):

perl -MJSON::XS -CS -0777ne'
BEGIN { $j = JSON::XS->new->relaxed(1) }
s/^(//;  s/)z//;
if (!length($_)) {
warn("Skipping $ARGV: Empty.n");
next;
}
my $data = eval { $j->decode($_) };
if (!$data) {
warn("Skipping $ARGV: $@");
next;
}
CORE::say
join ",",
map { join ":", $_->{company}, $_->{time} }
@{ $data->{Companies} };
' *.json

最新更新