Perl JSON decode with positioned errors
Perl
use strict;
use warnings;
use JSON::PP ();
sub parse_json {
my ($text) = @_;
die "empty input\n" unless defined $text && length $text;
my $data = eval { JSON::PP->new->utf8->allow_nonref->decode($text) };
return $data unless $@;
my $err = $@;
my ($offset) = $err =~ /at character offset (\d+)/;
$err =~ s/\s+at \S+ line \d+.*//s;
die defined $offset ? "JSON error at byte $offset: $err\n" : "JSON error: $err\n";
}
for my $doc ('{"a":1}', '{"a":') {
my $ok = eval { parse_json($doc) };
print $ok ? "parsed\n" : $@;
}