我正在使用perl来解析json文件。当一切正常时,我发现匹配的牙套很好。但是如果存在不匹配,我就无法想出找到它的好方法。
此时我的数据是一个排序数组(@merged) 文件中大括号的偏移,关闭大括号的偏移设置为负。
以下是进行匹配的部分:
@stack=(); foreach $val (@merged) # go through merged array { if ($val>0) { push @stack, $val;} # push every opener onto a stack else { $opn = pop @stack; # when a closer comes up, pop previous opener @tmp = ($opn, abs $val); # array of one match push @matches, [@tmp]; # the array of all matches } }
我也有关于该列的信息,但我不希望算法依赖于强制格式化。
我也想把它改编成perl文本,因为翻译者说最后有一个无与伦比的支撑。
是否有任何良好的启发式方法可以找到不匹配的位置?
答案 0 :(得分:2)
使用解析器,不要尝试重新发明轮子。这是一个例子:
#!/usr/bin/env perl
use strict;
use warnings;
use JSON qw( decode_json encode_json );
my $data = { foo => 'bar', baz => [1,2,3], qux => { abc => 1, def => 2, ghi => 3} };
my $json = encode_json($data);
my $error_json = $json;
$error_json =~ s|\]||; # Remove a closing square bracket
eval {
my $error_data = decode_json($error_json); # Will throw an error
};
my $error = $@;
if ($error) {
print "JSON Error : $error";
my ($char_pos) = $error =~ m|at character offset (\d+)|;
print "Original : '$json'\n";
print "Error : '$error_json'\n";
print "..............";
print "."x($char_pos) . "^\n";
} else {
die "should not get here...something went wrong";
}
<强>输出强>
JSON Error : , or ] expected while parsing array, at character offset 31 (before ":{"abc":1,"ghi":3,"d...") at foo.pl line 15.
Original : '{"foo":"bar","baz":[1,2,3],"qux":{"abc":1,"ghi":3,"def":2}}'
Error : '{"foo":"bar","baz":[1,2,3,"qux":{"abc":1,"ghi":3,"def":2}}'
.............................................^
答案 1 :(得分:0)
我发现了一种大多数时候都会起作用的启发式方法,特别是如果你强迫要打开和关闭括号。
我扫描文件,找到匹配的括号,找到列之间的差异。该错误通常比大多数匹配更大的差异。
当然,我必须忽略评论或引号中的括号。
我已将它与.pl和.js文件一起使用,效果很好。